【问题标题】:Redis Hyperloglog - PFCOUNT side effectRedis Hyperloglog - PFCOUNT 副作用
【发布时间】:2014-06-03 13:38:35
【问题描述】:

Redis 最近发布了名为 HyperLogLog 的新数据结构。它允许我们保留唯一对象的数量,并且只占用 12k 字节的大小。我不明白的是,Redis 的 PFCOUNT 命令据说在技术上是一个写命令。为什么会这样?

注意:作为调用此函数的副作用,HyperLogLog 可能会被修改,因为最后 8 个字节编码最新计算的基数以用于缓存目的。所以 PFCOUNT 在技术上是一个写命令。

【问题讨论】:

    标签: data-structures redis hyperloglog


    【解决方案1】:

    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. */
    };
    

    注意 card 字段:它包含算法评估的最后一个基数。计算基数的估计是一项昂贵的操作,因此 Redis 会缓存该值并将其保存在该字段中。

    当调用 PFADD 时,HyperLogLog 对象可能会更新或不更新(很有可能不会更新)。如果没有更新,调用 PFCOUNT 将重用缓存的值(卡片字段)。如果更新,则卡片字段无效,因此下一个PFCOUNT会执行计数算法,并将新值写入卡片字段。

    这就是 PFCOUNT 可以改变 HyperLogLog 对象的原因。

    【讨论】:

    • 我不太明白,是不是说如果我调用pfcount,cardinality可以加1?如果是,我想知道为什么更新缓存字段会影响原始基数。
    猜你喜欢
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2017-07-04
    相关资源
    最近更新 更多