首页/数据/数据库速查/HyperLogLog 基数估算(PFADD/PFCOUNT/PFMERGE)
Redis 命令96 条

HyperLogLog 基数估算(PFADD/PFCOUNT/PFMERGE)

用约 12KB 内存估算集合基数(标准误差 0.81%):PFADD 添加、PFCOUNT 估算、PFMERGE 合并;适合 UV 等大基数近似统计。

数据库速查数据更新于 2026-10-13

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 结果用于结算、对账这类需要精确性的场景:千分之几的偏差在金额或配额上会造成实际误差。

易错点

  • 拿 PFCOUNT 的输出当精确值对外汇报:与明细系统对账时会出现无法解释的差异
  • 小基数场景也使用 HLL:固定的稀疏编码开销不一定低于等价 Set,量级没上来之前得不偿失
  • 需要列出成员时才发现结构选错:HLL 无法枚举成员,只能推倒重来
  • 在高频报表里对多个键直接 PFCOUNT:每次查询都要临时合并,应先用 PFMERGE 落一个汇总键

数据来源与参考

  • Redis 官方文档: HyperLogLog
  • Redis 官方文档: PFCOUNT

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌