*Redis TDIGEST.MERGE 命令
TDIGEST.MERGE 将一个或多个源 t-digest 合并到目标 t-digest 中。
*语法
TDIGEST.MERGE destination source [source ...] [COMPRESSION compression] [OVERRIDE]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| destination | String | 是 | 目标 t-digest 键名 |
| source | String | 是 | 源 t-digest 键名,支持多个 |
| COMPRESSION | Keyword | 否 | 指定压缩因子的关键字 |
| compression | Integer | 否 | 合并时使用的压缩因子,默认取源和目标的最大值 |
| OVERRIDE | Flag | 否 | 如果 destination 已存在,覆盖其内容 |
*返回值
- OK:合并成功
- Error:key 不存在、类型错误或参数错误
*时间复杂度
O(M·log(N)),M 为源 t-digest 的节点总数,N 为合并后的节点数。
*示例
*基本用法
> TDIGEST.CREATE digest1
OK
> TDIGEST.ADD digest1 1 2 3
OK
> TDIGEST.CREATE digest2
OK
> TDIGEST.ADD digest2 4 5 6
OK
> TDIGEST.MERGE merged digest1 digest2
OK
> TDIGEST.MAX merged
"6"
> TDIGEST.MIN merged
"1"
*指定压缩因子
> TDIGEST.CREATE a COMPRESSION 100
OK
> TDIGEST.CREATE b COMPRESSION 200
OK
> TDIGEST.MERGE merged a b COMPRESSION 300
OK
> TDIGEST.INFO merged
1) "Compression"
2) "300"
...
*覆盖已存在的目标
> TDIGEST.CREATE dest
OK
> TDIGEST.ADD dest 100
OK
> TDIGEST.CREATE src
OK
> TDIGEST.ADD src 1 2 3
OK
> TDIGEST.MERGE dest src OVERRIDE
OK
> TDIGEST.MAX dest
"3"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 参数不足 | 至少提供 destination 和一个 source |
| ERR key does not exist | source 或 destination 不存在 | 确保所有 key 都已创建 |
| WRONGTYPE | key 不是 t-digest | 检查 key 的数据类型 |
| ERR destination key exists and is not a t-digest | destination 已存在且为其他类型 | 使用 OVERRIDE 或更换 key |
*最佳实践
- 聚合分布式数据:各节点维护本地 t-digest,定期 MERGE 到中心节点进行全局统计
- 分片聚合:大数据量场景下分片计算,最后 MERGE 汇总
- 数据保留策略:使用 OVERRIDE 可在合并时覆盖旧数据,实现滑动窗口聚合
- 压缩因子选择:合并时指定统一的 compression 确保全局一致性
*FAQ
Q1: MERGE 后源 t-digest 会被删除吗? A: 不会。MERGE 只读取源数据,源 key 保持不变。
Q2: 可以合并不同压缩因子的 t-digest 吗? A: 可以。合并时会统一使用目标 compression(默认取最大值),数据不会丢失。
Q3: MERGE 和分别 ADD 所有数据有什么区别? A: MERGE 更效率,尤其在分布式场景下只需传输压缩后的节点数据而非原始观测值。