如果Redis中的HyperLogLog不存储实际成员,而只存储计数,那么PFMERGE是如何工作的



HyperLogLog是存储实际成员还是只存储其存储的成员数?

如果它没有存储实际成员,PFMERGE如何知道哪一个元素要合并为计数为1,即使它们在多个HyperLogLog 中重复

PFADD mobileusers user1 user2 user3
PFADD websiteusers user2 user3 user4
PFMERGE totalusers mobileusers websiteusers
PFCOUNT totalusers
4

merge命令如何知道user2和user3在HyperLogLog中重复?

这涉及到深入研究hyperloglog数据结构的工作方式。

基本上,您可以用2~1字节的2^p寄存器初始化hyperloglog(p是一个常数,通常在16到18之间——在Redis中,我很确定它是18。当你得到一个要插入到超级日志中的集合的值时,你对该值进行散列,散列后的值,你检查前p位(最高有效->最低有效(,该值是你要设置的寄存器号,然后你将该寄存器设置为寄存器当前值的最大值,或最右边1的位置。

由于最后一个操作(设置寄存器的最大值(,实际上通过将每个寄存器设置为两者之间的最大值,可以相对容易地返回到正在合并的两个hyperloglog并将其组合。

如果你想确切地了解hll算法是如何工作的,你可以看看Flajolte等人在hll首次引入时的论文。

相关内容

最新更新