*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 一样使用 PFADDPFCOUNT

Q3: 合并 100 个 HyperLogLog 性能如何? A: 非常快。PFMERGE 的时间复杂度为 O(N),N 为源 key 数量。每个 key 的合并操作是常数时间,100 个 key 通常在毫秒级完成。