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,否则统计上线后无法回溯补数。