*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 时,截尾均值接近中位数。中位数可视为极端截尾(只保留中间一个值)的特殊情况。