2014-04-19 4 views
3

Redis는 최근 HyperLogLog라는 새로운 데이터 구조를 출시했습니다. 그것은 우리로 하여금 고유 한 객체의 수를 유지하도록 허용하고 단지 12k 바이트의 크기를 차지합니다. 내가 이해할 수없는 것은 Redis의 PFCOUNT 명령은 기술적으로 쓰기 명령이라고합니다. 왜 이런 경우입니까?Redis Hyperloglog - PFCOUNT 부작용

참고 :이 함수를 호출 할 때의 부작용으로 마지막 8 바이트가 캐싱 목적으로 최신 계산 된 카디널리티를 인코딩하기 때문에 HyperLogLog가 수정 될 수 있습니다. 따라서 PFCOUNT는 기술적으로 쓰기 명령입니다. 다음

답변

3

HyperLogLog 개체의 헤더는 다음

struct hllhdr { 
    char magic[4];  /* "HYLL" */ 
    uint8_t encoding; /* HLL_DENSE or HLL_SPARSE. */ 
    uint8_t notused[3]; /* Reserved for future use, must be zero. */ 
    uint8_t card[8]; /* Cached cardinality, little endian. */ 
    uint8_t registers[]; /* Data bytes. */ 
}; 

참고 카드 필드 :이 알고리즘 평가 마지막 카디널리티를 포함한다. 카디널리티의 계산을 계산하는 것은 비용이 많이 드는 작업이므로 Redis는 값을 캐시에 저장하고이 필드에 유지합니다.

PFADD를 호출하면 HyperLogLog 개체가 업데이트되거나 업데이트되지 않을 수 있습니다 (가능성이 높음). 업데이트되지 않으면 PFCOUNT를 호출하면 캐시 된 값 (카드 필드)이 다시 사용됩니다. 업데이트되면 카드 필드가 무효화되므로 다음 PFCOUNT가 계산 알고리즘을 실행하고 새 값을 카드 필드에 씁니다.

그래서 PFCOUNT가 HyperLogLog 개체를 변경할 수 있습니다.

+0

명확하게 이해하지 못합니다. pfcount를 호출하면 카디널리티가 1 씩 증가 할 수 있습니까? 그렇다면 캐시 필드를 업데이트하면 원래의 카디널리티에 영향을 미칠 수 있습니다. –