*Redis TDIGEST.QUANTILE 命令

TDIGEST.QUANTILE 返回给定分位数对应的观测值估计,即数据分布的百分位点估计。


*语法

TDIGEST.QUANTILE key quantile [quantile ...]

*参数说明

参数 类型 必填 说明
key String t-digest 键名
quantile Double 分位数值,0~1 之间,支持一次查询多个

*返回值

  • Array:每个分位数对应的估计值数组
    • 分位数 0 对应最小值
    • 分位数 1 对应最大值
  • Error:key 不存在、类型错误或参数错误

*时间复杂度

O(log(N)),N 为 t-digest 中合并节点的数量。M 个分位数为 O(M·log(N))。


*示例

*基本用法

> TDIGEST.CREATE temp
OK
> TDIGEST.ADD temp 10 20 30 40 50
OK
> TDIGEST.QUANTILE temp 0.5
1) "30"
> TDIGEST.QUANTILE temp 0.9
1) "46"

*查询多个分位数

> TDIGEST.CREATE latency
OK
> TDIGEST.ADD latency 10 20 30 40 50 60 70 80 90 100
OK
> TDIGEST.QUANTILE latency 0.5 0.95 0.99
1) "55"
2) "95"
3) "99"

*边界分位数

> TDIGEST.QUANTILE temp 0 0.25 0.5 0.75 1
1) "10"
2) "20"
3) "30"
4) "40"
5) "50"

*常见错误

错误 原因 解决
ERR wrong number of arguments 未提供 key 或 quantile 检查参数数量
ERR key does not exist key 不存在 确认 key 已创建并添加数据
WRONGTYPE key 不是 t-digest 检查 key 的数据类型
ERR value is not a valid float quantile 非有效浮点数 检查输入格式
ERR quantile should be in [0,1] quantile 超出 [0,1] 范围 确保 quantile 在 0~1 之间

*最佳实践

  • P50/P95/P99 延迟监控:TDIGEST.QUANTILE 是监控延迟分布的理想工具
  • 批量查询优于多次调用:一次查询多个分位数比多次单值查询更高效
  • 理解近似性:结果是近似估计,极端分位数(如 0.99999)误差可能较大
  • 配合 TDIGEST.CDF 使用:CDF 和 QUANTILE 互为逆函数,可互相验证

*FAQ

Q1: QUANTILE 和 BYRANK 有什么区别? A: QUANTILE 输入分位比例(0~1)返回值;BYRANK 输入排名(0-based count)返回值。rank ≈ quantile × total_count。

Q2: 结果为什么是近似值? A: t-digest 是概率数据结构,通过压缩节点实现高效存储,分位数是基于节点插值的估计值,不是精确排序结果。

Q3: 0.5 分位数就是中位数吗? A: 是的。0.5 分位数(P50)就是中位数估计,约有一半的观测值小于等于该值。