首页/数据/Redis 进阶速查/PFMERGE:合并多个 HyperLogLog
数据结构与选型42 条

PFMERGE:合并多个 HyperLogLog

PFMERGE 把多个 HLL 的寄存器合并到目标键,用于跨时间段/维度的去重基数合并;合并结果仍是概率估算,不能还原成员。

Redis 进阶速查数据更新于 2026-10-13

PFMERGE 与基数估算

PFMERGE 把一个或多个 HyperLogLog 的寄存器按位取最大值合并进目标键,用来把分时间段、分维度统计的基数合成一个总数。HyperLogLog 用固定的稀疏或稠密结构估算集合基数,标准误差约 0.81%,代价是只给估算值:既不能枚举成员,也不能删除单个元素。

基本信息

语法PFMERGE destkey [sourcekey ...]
引入版本Redis 2.8.9 起提供 HLL 系列命令
返回值字符串 OK,合并结果写入 destkey
误差水平标准误差约 0.81%
内存占用稠密形态单个 HLL 约 12KB
权限要求普通用户即可,属于写操作

典型使用场景

  • 周 UV 合成月 UV:每天一个 HLL,逐层合并出更长周期口径
  • 多入口汇总:各机房或各网关先本地统计,再合并成全局去重数
  • 交叉维度报表:按渠道、版本各留一个 HLL,按需组合任意子集口径
  • 海量去重:上亿 UV 场景用固定内存替代精确 set 节省空间
  • 口径补算:历史分片重新合并,重算某个时间窗的总量

常用写法

常用写法
redis-cli PFADD uv:1001 u1 u2 u3               # 写入当天访问标识
redis-cli PFADD uv:1002 u4 u5                  # 写入次日访问标识
redis-cli PFCOUNT uv:1001 uv:1002              # 临时求并集基数,不落盘
redis-cli PFMERGE uv:week1 uv:1001 uv:1002     # 合并成周口径并落成一个键
redis-cli PFCOUNT uv:week1                     # 读取合并后的估算基数
redis-cli TYPE uv:week1                        # 类型显示 string,HLL 的底层形态

返回与形态读法

项含义判断
PFADD 返回1 表示基数可能变化,0 表示未变化长期恒为 0 说明输入重复或统计中断
PFCOUNT 返回估算基数整数与真实去重数有约 1% 内偏差属正常
TYPE 返回string显示 string 不代表它是普通字符串键
MEMORY USAGE稠密形态约 12KB远超 12KB 要确认是否被当普通字符串追加过
PFCOUNT 传多个键会在内存里临时合并再计算,开销明显高于单键;报表端高频读取时先用 PFMERGE 落成一个键,之后反复 PFCOUNT 单键即可。
HLL 只保存寄存器,无法回答「某用户是否访问过」。需要判断成员归属的场景应交给 set 或 bitmap,否则统计上线后无法回溯补数。

易错点

  • 把 HLL 当精确计数器:误差方向不固定,计费、配额这类要求精确值的口径不能用它
  • 试图从 HLL 中查具体成员:结构里根本没有元素,事后没有任何命令能补救,只能重新统计
  • 合并键只增不减又没设 TTL:历史口径长期驻留,日积月累占用可观内存
  • 对 HLL 执行 APPEND、SETRANGE 等字符串改写:底层编码被破坏后 PFCOUNT 结果不可信

数据来源与参考

  • Redis 官方文档:PFMERGE 说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌