*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 更效率,尤其在分布式场景下只需传输压缩后的节点数据而非原始观测值。