*Redis TDIGEST.TRIMMED_MEAN 命令

TDIGEST.TRIMMED_MEAN 计算截尾均值(Trimmed Mean),即去掉一定比例的最大值和最小值后计算的平均值。


*语法

TDIGEST.TRIMMED_MEAN key low high

*参数说明

参数 类型 必填 说明
key String t-digest 键名
low Double 下限分位数(0~1),低于此分位数的值会被排除
high Double 上限分位数(0~1),高于此分位数的值会被排除

*返回值

  • Double:截尾均值估计值(字符串形式返回)
  • Nil:无法计算时(如空结构、low >= high 等)
  • Error:key 不存在、类型错误或参数错误

*时间复杂度

O(log(N)),N 为 t-digest 中合并节点的数量。


*示例

*基本用法

> TDIGEST.CREATE temp
OK
> TDIGEST.ADD temp 10 20 30 40 50 60 70 80 90 100
OK
> TDIGEST.TRIMMED_MEAN temp 0.1 0.9
"54.999999999999999"

*排除极端值计算均值

> TDIGEST.CREATE latency
OK
> TDIGEST.ADD latency 10 12 15 18 20 22 25 200 500
OK
> TDIGEST.TRIMMED_MEAN latency 0 0.9
"19.125"
> TDIGEST.TRIMMED_MEAN latency 0.1 0.9
"18.75"

*与中位数对比

> TDIGEST.ADD temp 10 20 30 40 50 60 70 80 90 100
OK
> TDIGEST.TRIMMED_MEAN temp 0.4 0.6
"44.999999999999999"
> TDIGEST.QUANTILE temp 0.5
1) "55"

*常见错误

错误 原因 解决
ERR wrong number of arguments 参数不足 提供 key、low、high 三个参数
ERR key does not exist key 不存在 确认 key 已创建并添加数据
WRONGTYPE key 不是 t-digest 检查 key 的数据类型
ERR low and high must be floats in [0,1] low/high 超出 [0,1] 范围 确保 low 和 high 在 0~1 之间
ERR low >= high low >= high 确保 low < high

*最佳实践

  • 排除异常值:截尾均值能有效减少极端异常值对均值的影响,比算术平均更稳健
  • 常用参数
    • 0.05 ~ 0.95:排除上下 5% 极端值(标准 10% 截尾)
    • 0.1 ~ 0.9:排除上下 10% 极端值(更稳健的 20% 截尾)
    • 0.25 ~ 0.75:排除上下 25%(类似四分位距中心)
  • 配合 QUANTILE 使用:先用 QUANTILE 了解分布,再选择合适的 low/high
  • 生产环境:监控延迟时,0.05~0.95 截尾均值比全量均值更能反映典型用户体验

*FAQ

Q1: 截尾均值和普通均值有什么区别? A: 普通均值包含所有数据,易受极端异常值影响;截尾均值去掉一定比例的最大最小值后计算,结果更稳健,更能反映典型水平。

Q2: low=0, high=1 时会怎样? A: 等价于全量均值(排除 0% 数据),但 t-digest 不直接支持精确均值计算,结果仍可能是近似值。

Q3: 截尾均值和中位数有什么关系? A: 当 low≈0.5 且 high≈0.5 时,截尾均值接近中位数。中位数可视为极端截尾(只保留中间一个值)的特殊情况。