引入
针对问题
- 针对用户访问量或活跃量进行统计,由于可能数量级较大,所以直接采用
HashMap
的方式会占用大量内存,不可取。并且,也因为数量级较大,所以最终的统计结果存在较小的偏差时可接受的 - 因此,Redis基于此,引入了HyperLogLog结构来处理大数量级的统计问题
发展
伯努利试验
- 为什么HyperLogLog可以通过较少的内存(官方解释可以通过12K内存就能统计2^64个数据),主要依靠概率论中的伯努利试验
- 实验的典故源于抛硬币,每次抛出硬币最终出现正方面的概率为50%。假设一直抛硬币,直到出现正面为止,记录为一次完整的试验
- 对于n次伯努利试验,意味着出现了n次正面,假设每次需要的次数为k_n,则必然会有一个kn的最大值记为k_max,基于极大似然估算的方法,发现存在估算关联
n = 2 ^ k_max
优化
- 做n次伯努利试验进行一次估算,可以称为一轮,仅作一轮估算时误差率会较大,因此我们