*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)就是中位数估计,约有一半的观测值小于等于该值。