*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。一般用于数据对冲或特殊统计场景。