介绍
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 类型