1.HyperLogLog介绍
1.1 基本概念
Redis中的HyperLogLog是一种用于估算集合中不同元素数量(即基数)的概率数据结构。它特别适用于处理非常大的数据集,与传统的精确计数方法相比,HyperLogLog可以在消耗极少量内存的情况下提供相对准确的估计值。HyperLogLog是在Redis 2.8.9版本中新增的数据类型。
什么是基数?指一个集合中不同元素的数量。例如,集合{1, 2, 3, 3, 4}的基数是4,因为其中有4个不同的元素。在实际应用中,可能需要统计大量数据中的不同元素数量。例如,在网页访问统计中,我们可能想要知道一天内有多少不同的IP地址访问了某个页面,这就是一个典型的基数统计问题。
HyperLogLog的原理基于伯努利试验和调和平均数。它通过随机映射函数将输入元素映射到一个固定大小的位图中,然后通过位图中零位的数量来估算基数。为了减小误差率,HyperLogLog使用了多个随机映射函数和稀疏位图等技术。
Redis内部为每个HyperLogLog实例创建了2的14方个桶(bucket),每个桶占用6比特的空间。当有新元素加入时,HyperLogLog 会对元素进行哈希运算,得到一个哈希值。然后根据哈希值的二进制表示,确