HyperLogLog是存储实际成员还是仅存储其正在存储的成员计数?
如果PFMERGE不存储实际成员,那么即使这些成员在多个HyperLogLog中重复,PFMERGE如何知道要合并的元素计数为1
PFADD mobileusers user1 user2 user3
PFADD websiteusers user2 user3 user4
PFMERGE totalusers mobileusers websiteusers
PFCOUNT totalusers
4
merge命令如何知道user2和user3在两个HyperLogLog中重复?
1条答案
按热度按时间jv4diomz1#
这涉及到深入研究超对数数据结构是如何工作的。
基本上,你用2^p个~1字节的寄存器初始化超对数(p是一个常数,通常在16到18之间--在Redis中我很确定它是18。当你得到一个你想插入到hyperloglog中的集合的值时,你对这个值进行哈希,这个哈希值,你检查前p位(最重要的-〉最不重要的),该值是要设置的寄存器编号,然后将该寄存器设置为寄存器当前值的最大值或最右侧1的位置。
因为最后一个动作(设置寄存器的最大值),实际上返回到两个被合并的超对数并将它们组合起来是相对容易的,只需将每个寄存器设置为两者之间的最大值。
如果你想确切地了解hll算法是如何工作的,你可以看看Flajolte et all在hll首次推出时发表的文章。