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对象的原因。

10-06 14:46