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 = ""

(2).统计

时间

内存消耗

1天

15KB

1个月

450KB

1年

15KB*365 = 5MB

4.使用经验

  • 是否能容忍错误(错误率大约是0.81%)
  • 是否需要单条数据(无法取出单条数据)