2017-10-11 3 views
-1

나는 이름 바꾸기 명령을 실행하면, 나는이 같은 무언가를 생각하는, 이전의 이름에 대한 Redis에서 Rename으로 데이터를 항상 사용할 수 있습니까?

  • 제거 참조 새로운 데이터에 대한

    1. 를 사용하여 새 이름
    2. 된 데이터를 제거 (시간이 좀 경우 걸릴 수 있습니다 대형)

    이 데이터에 액세스하는 클라이언트의 경우 이러한 경우가 있습니까?

    1. 의 핵심은 데이터가 레디 스의 이름을 변경 명령을 실행하는 동안 수행되는 어떤 단계

    액세스

  • 동안
  • 레디 스가 달려 좋은 상태가 아닌
  • 존재하지 않는 이유는 무엇입니까?

  • 답변

    1

    Redis에는 단일 스레드 실행 명령이 있기 때문에 이름 바꾸기는 원자 단위이므로 1과 2에 대한 대답은 아니오입니다. "이전 데이터 제거"에 대한 것은 대상 키가 이미 삭제해야하는 큰 구조를 가리키고있는 경우에만 해당됩니다 (Redis가이를 제거합니다). 원래 데이터 객체는 복사되지 않습니다. 이를 가리키는 해시 테이블 항목 만 이동 될 수 있습니다. Redis에서 다시 해싱하는 것이 점진적이기 때문에 이는 본질적으로 일정한 시간이어야합니다.

    Redis는 단일 스레드 명령 실행으로 인해 느린 명령에서 항상 "멈춤"합니다. 그래서 3을 위해, 당신이하고있는 일에 따라 항상 yes 일 수 있습니다. 그러나이 경우에는 엄청나게 큰 암시 적 삭제를 할 때만 가능합니다.

    편집 : Redis 4.0에서 구성 옵션 lazyfree-lazy-server-del yes (기본값은 no)을 실제로 지정할 수 있으며 서버는 실제로 이와 같은 부작용 삭제를 위해 비동기 적으로 삭제합니다. 즉, 차단을 삭제하는 대신 개체를 백그라운드 삭제 대기열에 넣습니다. 이것은 효과적으로 RENAME 일정 시간을 만들 것입니다. 샘플 cfg 참조 : https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf