Redis `HLL` (HyperLogLog) 内部存储:稀疏表示与稠密表示

各位观众,各位朋友,欢迎来到今天的Redis茶话会!今天我们要聊的是Redis里一个听起来高大上,但其实挺好玩的数据结构——HyperLogLog,简称HLL。这玩意儿,简单来说,就是用来估算集合里有多少个不同元素的。 你可能会问:“估算?为啥不用集合直接存?精准它不香吗?” 哎,这就是HLL的妙处所在。当你的数据量大到爆炸,比如几百万、几千万甚至上亿的时候,直接存可就爆炸了你的内存。HLL呢,它用极小的内存,就能给你一个相当靠谱的估算结果。就像你猜瓜子数量,不用一颗颗数,看看体积大概就能估个八九不离十。 那HLL是怎么做到的呢?关键就在于它的内部存储结构:稀疏表示和稠密表示。 这就好比你家衣柜,衣服少的时候随便塞,衣服多了就要整理一下才能塞更多。 一、HLL的原理:抛硬币的哲学 在深入了解稀疏和稠密表示之前,我们先来理解HLL的核心思想。这思想,说白了,就是抛硬币。 想象一下,你不停地抛硬币,直到出现正面为止。记录你抛了多少次才出现正面。如果让你估计你总共抛了多少次,你会怎么做? 是不是感觉有点懵?别急,咱们换个角度。如果我告诉你,你抛了100次硬币,最长的一次连续反面的次数是5次, …