Hyper Log Log
使用场景
大数据量的不精确的去重复估计.
优点
占用空间小,12kb.可以估计\(2^{64}\)大小的数据.
缺点
不精确,标准误差0.81%.
原理简介
来源于N重伯努利试验.
根据抛硬币的正面(1)与反面(0)出现的次数,估计抛硬币的总次数.
例如硬币结果:
10011000.
从右往左,第四次出现了1,推测一共抛了\(2^{4}=16\)次硬币.
单独的估计是会有偏差的,所以HLL会执行分桶,并且进行调和平均数,进行估计.
Redis中,将输入的数据进行HASH,变更为64位二进制,进行分桶统计.
抛硬币中,通过对应1的个数,推断总抛硬币的个数,对应于HLL中,
就是通过桶中的个数,去估计当前HLL中,出现的不重复的元素数量.
占用空间小的原因
对于一个64bit的数据,将它分为高50位和低14位.
- 将低14位转为桶编号.
- 将高50位进行估计,当前一共出现了多少中不同的输入.
因为对于高50位,最晚出现1的位数是最高位,所以最多在桶中存储的数字大小是50,只需要6个bit即可.
所以,每个桶的大小只需要6bit.
所以一个HLL所需的大小为:
\[2^{14}*6 / 8 = 12288
\]
12288b,即 12kb.
Redis命令
pfadd key element [element...] # 向指定的key中添加元素,可以添加多个
pfcount key [key...] # 获取指定key中不重复元素的数量,如果多个key,则数量相加
pfmerge destkey sourcekey [sourcekey...] #进行合并操作