HyperLogLog 的取舍
HyperLogLog 用固定的极小空间估算集合基数:每个键最多约 12KB,标准误差约 0.81%。它把「有多少个不同的值」变成一个概率问题,因此能用 Set 存不下的数据量做统计。代价是它只能回答数量,不能回答某个元素是否存在,也不能删除单个元素,适合只关心规模趋势的统计场景。
基本信息
| 适用平台 | Redis 2.8.9+ 支持 HyperLogLog |
|---|---|
| 核心命令 | PFADD、PFCOUNT、PFMERGE |
| 空间开销 | 每键最多约 12KB,小基数使用稀疏编码更省 |
| 误差范围 | 标准误差约 0.81%,与实际值存在小幅偏差 |
| 合并语义 | PFMERGE 是幂等的并集操作 |
典型使用场景
- 日活、周活、月活等 UV 统计,基数远大于可用内存预算
- 多天数据合并出周期去重值,避免维护多个大 Set
- 广告或活动曝光去重统计,只关心规模不关心名单
- 接口去重量的趋势监控,用于容量评估
- 跨业务线汇总去重规模,PFMERGE 直接并集
UV 统计示例
UV 统计示例
PFADD uv:20261012 u1 u2 u3
PFADD uv:20261012 u3 u4
PFCOUNT uv:20261012 # 约 4(估算值)
# 合并多天得到周期去重值
PFMERGE uv:week uv:20261005 uv:20261006 uv:20261012
PFCOUNT uv:week
# 多键直算:内部先合并再计数,开销大于单键查询
PFCOUNT uv:20261005 uv:20261006
# 对比精确方案的内存占用
SADD uv:exact u1 u2 u3 u4
SCARD uv:exact # 4(精确,但内存随基数增长)关键特性
| 特性 | 说明 | 影响 |
|---|---|---|
| 内存占用 | 每键约 12KB 上限 | 基数极大时优势明显 |
| 误差 | 标准误差约 0.81% | 不适合对账类精确统计 |
| 能否判断存在 | 不能 | 需要成员判断请用 Set |
| 能否删除单个元素 | 不能 | 数据修正只能整键重算 |
| 合并 | PFMERGE 幂等并集 | 支持跨天、跨维度汇总 |
报表里的 UV 与精确值对不上属于预期:HLL 是概率估算,只要量级与趋势一致即可用于运营判断;需要精确数字时应改用 Set 或位图方案。
不要把 HLL 结果用于结算、对账这类需要精确性的场景:千分之几的偏差在金额或配额上会造成实际误差。