介绍

HyperLogLog(基数统计)是 Redis 2.8.9 版本新增的数据类型,用于基数统计(统计一个集合中不重复的元素个数)。但要注意,HyperLogLog 是基于概率完成的,不是非常准确,标准误算率是 0.81%

简单来说 HyperLogLog 提供不精确的去重计数

优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的内存空间总是固定的、并且是很小的。每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数,和元素越多就越耗费内存的 Set 和 Hash 相比,HyperLogLog 就非常节省空间

内部实现

涉及到很多数学问题,难以理解,可以参考维基百科

常见命令

HyperLogLog 命令很少,就 3 个:

# 添加指定元素到 HyperLogLog 中
PFADD key element [element ...]
 
# 返回给定 HyperLogLog 的基数估算值
PFCOUNT key [key ...]
 
# 将多个 HyperLogLog 合并为一个 HyperLogLog
PFMERGE destkey sourcekey [sourcekey ...]

应用场景

百万级网页 UV 计数

HyperLogLog 优势在于只需要花费 12 KB 内存,就可以计算接近 2^64 个元素的基数,所以非常适合统计百万级以上网页 UV 的场景

# 把访问 page1 页面的每个用户添加到 HyperLogLog
PFADD page1:uv user1 user2 user3 user4 user5
 
# 获取 page1 的 UV 值
PFCOUNT page1:uv

要注意 HyperLogLog 的统计规则是基于概率完成的,给出的统计结果有一定误差,标准误算率是 0.81%

如果需要精确统计结果的话,最好还是用 Set 或 Hash 类型