*Redis PFMERGE 命令
PFMERGE 将多个 HyperLogLog 合并为一个新的 HyperLogLog。
*语法
PFMERGE destkey sourcekey [sourcekey ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| destkey | String | 是 | 合并后的目标 HyperLogLog 键名 |
| sourcekey | String | 是 | 源 HyperLogLog 键名,支持多个 |
*返回值
- OK:合并成功
- 如果 destkey 已存在且不是 HyperLogLog,会被覆盖为 HyperLogLog 类型
- 如果 sourcekey 不存在,会被视为空的 HyperLogLog
*时间复杂度
O(N),N 为要合并的 HyperLogLog 数量。合并后的结果是 O(1) 空间。
*示例
*基本合并
> PFADD hll1 a b c
(integer) 1
> PFADD hll2 c d e
(integer) 1
> PFMERGE hll3 hll1 hll2
OK
> PFCOUNT hll3
(integer) 5
*合并多个 HyperLogLog
> PFADD day1 user1 user2 user3
(integer) 1
> PFADD day2 user3 user4 user5
(integer) 1
> PFADD day3 user5 user6 user7
(integer) 1
> PFMERGE week day1 day2 day3
OK
> PFCOUNT week
(integer) 7
*源 key 不存在的场景
> PFMERGE dest hll1 notexist
OK
> PFCOUNT dest
(integer) 3
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 未提供 destkey 或 sourcekey | 至少提供 destkey 和一个 sourcekey |
| WRONGTYPE | sourcekey 不是 HyperLogLog 类型 | 确认 sourcekey 的类型 |
*最佳实践
- 多维度统计聚合的核心工具,如将每日 UV 合并为周 UV、月 UV
- 合并操作不丢失精度,合并后的 HyperLogLog 仍然是 12KB
- 合并后无需保留原始 HyperLogLog 时,可用 PFMERGE 结果 + DEL 原 key 节省内存
- 跨服务器/分片的 HyperLogLog 数据可先合并再计算,避免重复统计
*FAQ
Q1: PFMERGE 会修改源 key 吗? A: 不会。PFMERGE 是只读操作(对源 key),只修改 destkey。源 key 完全不受影响。
Q2: 合并后的 HyperLogLog 还能继续 PFADD 吗? A: 可以。PFMERGE 生成的是标准的 HyperLogLog 结构,可以像普通 HyperLogLog 一样使用 PFADD 和 PFCOUNT。
Q3: 合并 100 个 HyperLogLog 性能如何? A: 非常快。PFMERGE 的时间复杂度为 O(N),N 为源 key 数量。每个 key 的合并操作是常数时间,100 个 key 通常在毫秒级完成。