Redis 命令及数据类型 -- TDigest
摘要
- 本文介绍 Redis 扩展模型 RedisBloom 中的 TDigest 数据类型
- 本文基于
redis-7.4.7,springboot-3.5.8 - Redis官网:https://redis.io/
- Redis 命令文档:https://redis.io/docs/latest/commands/
- RedisBloom 的安装参见 Redis 扩展模块 -- RedisBloom 的安装方法
T-Digest(分位数估计算法)
-
T-Digest(TDigest)解决的问题与 CMS、TopK 完全不同,核心目标是 分位数(quantile)统计。
-
T-Digest 由 Ted Dunning 提出,专门为
高精度尾部分位数设计。 -
TDigest 可以在极低内存占用下,近似计算分位数(P50 / P90 / P99 / Median 等)。
-
分位数(Percentile)指标对照表
| 指标 | 英文全称 | 数学含义 | 通俗解释 | 典型业务解读 | 常见使用场景 |
|---|---|---|---|---|---|
| Median | Median | 排序后位于中间位置的值 | 一半数据在它左右 | “一般用户的体验” | 基础体验评估 |
| P50 | 50th Percentile | 50% 的数据 ≤ 该值 | 和 Median 完全相同 | “典型请求耗时” | 常规性能监控 |
| P90 | 90th Percentile | 90% 的数据 ≤ 该值 | 10% 的请求更慢 | “大多数用户的体验” | 业务体验监控 |
| P95 | 95th Percentile | 95% 的数据 ≤ 该值 | 5% 的请求更慢 | “尾部开始恶化” | SLA 边界监控 |
| P99 | 99th Percentile | 99% 的数据 ≤ 该值 | 1% 的请求最慢 | “极端但真实的用户体验” | 核心 SLA / SLO |
| P99.9 | 99.9th Percentile | 99.9% 的数据 ≤ 该值 | 千分之一最慢请求 | “极端尾延迟” | 金融 / 核心链路 |
| Max | Maximum | 数据中的最大值 | 最慢的那一次 | 噪音极大 | 几乎不用 |
一个快速理解示例
1 | 假设 100 次请求: |
-
工程实践中的“标准搭配”
| 应用场景 | 常看指标 |
|---|---|
| Web / API 服务 | P90 / P99 |
| 微服务链路 | P99 / P99.9 |
| 数据库 / 存储 | P95 / P99 |
| 前端体验 | P50 / P90 |
-
一句话:TDigest 用于统计数字的分布,P50 看中间,P90 看大多数,P99 看最差那 1%
RedisBloom 中 TDigest 的核心命令
创建 TDigest
1 | # TDIGEST.CREATE key [COMPRESSION compression] |
添加样本
1 | # TDIGEST.ADD key value [value ...] |
查看最大/最小值
1 | # 获取最大值 |
查询分位数
1 | # TDIGEST.QUANTILE key quantile [quantile ...] |
反向查询(值 → 百分位)
1 | # TDIGEST.CDF key value [value ...] |
合并 TDigest
1 | # TDIGEST.MERGE destination-key numkeys source-key [source-key ...] [COMPRESSION compression] [OVERRIDE] |
获取近似排名
1 | # 正向排名 |
根据排名获取元素
1 | # 正向排名 |
计算 TDigest 内部样本 去掉尾部极值后的平均近似值(Trimmed Mean,截断均值)
-
去掉数据分布的极端尾部,只算主要集中区域的平均值,这样更能代表“绝大多数用户的体验”
1 | # TDIGEST.TRIMMED_MEAN key low_cut_quantile high_cut_quantile |
获取 TDigest 的信息
1 | # TDIGEST.INFO key |
清空元素
1 | # TDIGEST.RESET key |
TDigest 的内存与精度
| 维度 | 特性 |
|---|---|
| 内存占用 | 与 COMPRESSION 成正比(通常 KB 级) |
| 精度 | 尾部分位数(P95/P99)极高 |
| 写入复杂度 | 近似 O(log n) |
| 查询复杂度 | O(log n) |
与样本数量无关。