Redis - HyperLogLog

Redis - HyperLogLog

HyperLogLog 使用动态字符串存储数据,为了区别普通的 SDS,在头部固定了字节 HYLL

HyperLogLog 底层数据结构

struct hllhdr {
    // 固定值 HYLL
    char magic[4];      /* "HYLL" */
    // 编码格式 HLL_DENSE 和 HLL_SPARSE
    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. */
};

HLL 存储分为两部分:hllhdr 和 registers。

registers: 用来存储组数据,
hllhdr: 为 HLL 的头部信息,

其中encoding来标识使用的编码,可以简单理解为空分组较多时使用稀疏编码存储,空分组较少时使用密集编码存储,内部计算使用HLL_RAW编码,因为数据总是增加的,所以一般只存在稀疏编码转为密集编码。

HLL 的命名

  • pfadd
  • pfcount
  • pfmerge

PFADD

  1. 功能:

pfadd 用来讲一个或多个元素添加到指定的 HLL 中。Redis 不保存元素本身,而是将元素散列后,找到对应分组并比较计数值,如果大于旧值则更新,反之则不更新。

PFADD key element [element element …]

  1. 原理

将所有元素添加到之地当的 HLL 数据结构中。如果对应的近似基数发生变化,则返回 1,否则返回 0。如果指定的 key 不存在,则会自动创建一个空的 HLL 数据结构并执行添加操作。不知道 element 的情况下,如果 key 不存在,也会创建一个新的 HLL 数据结构并返回 1。否则什么也不做,并返回 0

  1. 源码实现原理

TODO 待处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值