Redis最近发布了他们的新数据结构,称为HyperLogLog。它使我们能够保留唯一对象的数量,并且仅占用12k字节的大小。我不明白的是,Redis的PFCOUNT命令在技术上被称为写命令。为什么会这样呢?
最佳答案
HyperLogLog对象的 header 如下:
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对象的原因。