*Redis TDIGEST.CDF 命令
TDIGEST.CDF 计算给定值的累积分布函数(Cumulative Distribution Function),即小于等于该值的观测值比例。
*语法
TDIGEST.CDF key value [value ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | t-digest 键名 |
| value | Double | 是 | 查询的值,支持一次查询多个 |
*返回值
- Array:每个查询值对应的 CDF 值(0~1 之间的浮点数)
- 0 表示该值小于所有观测值
- 1 表示该值大于等于所有观测值
- Error:key 不存在、类型错误或参数错误
*时间复杂度
O(log(N)),N 为 t-digest 中合并节点的数量。M 个查询值为 O(M·log(N))。
*示例
*基本用法
> TDIGEST.CREATE scores
OK
> TDIGEST.ADD scores 10 20 30 40 50
OK
> TDIGEST.CDF scores 25
1) "0.4"
> TDIGEST.CDF scores 50
1) "1"
*查询多个值的 CDF
> TDIGEST.CREATE latency
OK
> TDIGEST.ADD latency 10 20 30 40 50 60 70 80 90 100
OK
> TDIGEST.CDF latency 15 35 55 75 95
1) "0.1"
2) "0.3"
3) "0.5"
4) "0.7"
5) "0.9"
*边界值
> TDIGEST.CDF scores 5
1) "0"
> TDIGEST.CDF scores 100
1) "1"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 未提供 key 或 value | 检查参数数量 |
| ERR key does not exist | key 不存在 | 确认 key 已创建并添加数据 |
| WRONGTYPE | key 不是 t-digest | 检查 key 的数据类型 |
| ERR value is not a valid float | value 非有效数字 | 检查输入格式 |
*最佳实践
- 理解统计含义:CDF = 0.9 表示约 90% 的数据小于等于该值
- 配合 QUANTILE 使用:CDF 和 QUANTILE 互为逆函数,CDF(value) = q 等价于 QUANTILE(q) ≈ value
- 批量查询性能:一次查询多个值比多次单值查询更高效
- SLO 验证:用 CDF 验证"99% 请求延迟 < Xms"之类的服务水平目标
*FAQ
Q1: CDF 和 QUANTILE 有什么区别? A: CDF 输入值返回比例(值 → 分位);QUANTILE 输入比例返回值(分位 → 值)。两者互为逆操作。
Q2: CDF 返回的值精确吗? A: t-digest 是近似数据结构,CDF 结果是近似值。数据量越大近似精度越好,通常误差在可接受范围内。
Q3: CDF 返回值可能为 0 或 1 吗? A: 会。当查询值小于所有观测值时返回 0;大于等于所有观测值时返回 1。