*Redis TDIGEST.REVRANK 命令
TDIGEST.REVRANK 返回给定观测值在 t-digest 中的反向排名(reverse rank),即大于该值的观测值数量(0-based)。
*语法
TDIGEST.REVRANK key value [value ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | t-digest 键名 |
| value | Double | 是 | 查询的观测值,支持一次查询多个 |
*返回值
- Array:每个值对应的反向排名数组(Integer)
- 反向排名 = 大于该值的观测值数量
- 最大值的反向排名为 0
- 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.REVRANK temp 25
1) (integer) 3
> TDIGEST.REVRANK temp 50
1) (integer) 0
*查询多个值的反向排名
> TDIGEST.CREATE scores
OK
> TDIGEST.ADD scores 10 20 30 40 50 60 70 80 90 100
OK
> TDIGEST.REVRANK scores 15 35 55 75 95
1) (integer) 9
2) (integer) 7
3) (integer) 5
4) (integer) 3
5) (integer) 1
*边界值
> TDIGEST.REVRANK temp 5
1) (integer) 5
> TDIGEST.REVRANK temp 100
1) (integer) 0
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| 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 非有效浮点数 | 检查输入格式 |
*最佳实践
- 理解反向排名语义:REVRANK 返回的是"大于该值的观测值数量",不是"大于等于"
- 结合 BYREVRANK 使用:REVRANK(值→反向排名)和 BYREVRANK(反向排名→值)互为逆操作
- 批量查询优于多次调用:一次传入多个 value 更高效
- 用于 Top-N 分析:REVRANK 0 = 最大值,适合"第 N 大"的分析场景
*FAQ
Q1: REVRANK 和 RANK 的关系是什么? A: 两者满足 REVRANK = total_count - RANK - 1。RANK 从最小值开始数,REVRANK 从最大值开始数。
Q2: 反向排名从 0 开始还是从 1 开始? A: 从 0 开始。REVRANK 返回的是大于该值的观测值数量,最大值的反向排名为 0。
Q3: 如果值不在数据集中,反向排名还有意义吗? A: 有意义。REVRANK 对任意值都有定义,返回的是该值在有序序列中的反向插入位置(大于它的元素个数)。