1.简介
- 基数统计的算法:在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的、并且是很小的。在Redis里面,每个hyperloglog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
- 不返回输入的各个元素:hyperloglog只会根据输入元素来计算基数,而不会储存输入元素本身。
- 误差:Redis中实现的HyperLogLog,只需要12K内存,在标准误差0.81%的前提下,能够统计2的64次方个数据,其本质上还是字符串。
2.API
-
向hyperloglog添加元素
pfadd key element
-
计算hyperloglog的独立总数
pfcount key
-
合并多个hyperloglog
pfcount key1 key2
3.内存消耗(百万独立用户)
(1).插入百万用户数据
elements = ""
key = "2016_05_01:unique:ids"
for i in 'seq 1 1000000'
do
elements = "${elements} uuid-"${i}
if [[ $((i%1000)) == 0 ]]
then
redis-cli pfadd ${key} ${elements}
elements = ""
fi
done
(2).统计
时间 | 内存消耗 |
---|---|
1天 | 15KB |
1个月 | 450KB |
1年 | 15KB*365 = 5MB |
4.使用经验
- 是否能容忍错误(错误率大约是0.81%)
- 是否需要单条数据(无法取出单条数据)