*Redis CMS.MERGE 命令

CMS.MERGE 将多个 Count-Min Sketch 合并到一个目标 sketch 中。


*语法

CMS.MERGE destination numKeys source [source ...] [WEIGHTS weight [weight ...]]

*参数说明

参数 类型 必填 说明
destination String 目标 sketch 的键名,必须已初始化
numKeys Integer 要合并的源 sketch 数量
source String 源 sketch 的键名,数量必须与 numKeys 一致
WEIGHTS Flag 权重标志,后面跟每个源 sketch 的权重
weight Integer 每个源 sketch 的乘数权重,默认值为 1

*返回值

  • OK:合并成功
  • Error:参数错误、键不存在、键类型错误、sketch 维度不匹配,或权重数量不匹配

*时间复杂度

O(n),其中 n 是源 sketch 的数量


*示例

*合并两个 sketch

> CMS.INITBYDIM test1 2000 5
OK
> CMS.INITBYDIM test2 2000 5
OK
> CMS.INITBYDIM dest 2000 5
OK
> CMS.INCRBY test1 foo 10
1) (integer) 10
> CMS.INCRBY test2 foo 20
1) (integer) 20
> CMS.MERGE dest 2 test1 test2
OK
> CMS.QUERY dest foo
1) (integer) 30

*带权重合并

> CMS.MERGE dest 2 test1 test2 WEIGHTS 1 3
OK
> CMS.QUERY dest foo
1) (integer) 70

*多个 sketch 合并

> CMS.INITBYDIM s1 2000 5
OK
> CMS.INITBYDIM s2 2000 5
OK
> CMS.INITBYDIM s3 2000 5
OK
> CMS.INITBYDIM dest 2000 5
OK
> CMS.MERGE dest 3 s1 s2 s3 WEIGHTS 1 2 1
OK

*常见错误

错误 原因 解决
ERR wrong number of arguments 参数数量不足 检查 numKeys 和 source 数量是否匹配
ERR key does not exist destination 或 source 不存在 确保所有 sketch 都已初始化
WRONGTYPE 键不是 CMS 类型 确认所有键都是 CMS sketch
ERR dimensions must match 源 sketch 和目标 sketch 维度不一致 所有 sketch 必须使用相同的 width 和 depth 初始化
ERR number of weights must match number of keys WEIGHTS 数量与 numKeys 不匹配 确保每个 source 都有对应的 weight

*最佳实践

  • 所有参与合并的 sketch 必须具有相同的 width 和 depth
  • 合并前用 CMS.INFO 检查各 sketch 的维度是否一致
  • 目标 sketch 必须预先初始化,合并不会自动创建
  • 使用 WEIGHTS 可实现加权合并,适合不同时间窗口或不同来源的数据聚合
  • 集群环境下注意多键操作的路由问题(所有 key 需在同一个 slot)

*FAQ

Q1: 合并后目标 sketch 原来的数据会丢失吗? A: 合并操作会将结果累加到目标 sketch 的现有计数器上,不会清空原有数据。如果需要清空,先 DEL 删除目标 key 再重新初始化。

Q2: 不同维度的 sketch 能合并吗? A: 不能。所有源 sketch 和目标 sketch 的 width 和 depth 必须完全相同,否则会报错。

Q3: WEIGHTS 权重为负数可以吗? A: 技术上可以,但通常不建议。负权重可能导致计数器异常或低于 0。一般用于数据对冲或特殊统计场景。