*Redis TDIGEST.RANK 命令

TDIGEST.RANK 返回给定观测值在 t-digest 中的排名(rank),即小于该值的观测值数量(0-based)。


*语法

TDIGEST.RANK 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.RANK temp 25
1) (integer) 2
> TDIGEST.RANK temp 30
1) (integer) 2

*查询多个值的排名

> TDIGEST.CREATE scores
OK
> TDIGEST.ADD scores 10 20 30 40 50 60 70 80 90 100
OK
> TDIGEST.RANK scores 15 35 55 75 95
1) (integer) 1
2) (integer) 3
3) (integer) 5
4) (integer) 7
5) (integer) 9

*边界值

> TDIGEST.RANK temp 5
1) (integer) 0
> TDIGEST.RANK temp 100
1) (integer) 5

*常见错误

错误 原因 解决
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 非有效浮点数 检查输入格式

*最佳实践

  • 理解排名语义:RANK 返回的是"小于该值的观测值数量",不是"小于等于"
  • 结合 BYRANK 使用:RANK(值→排名)和 BYRANK(排名→值)互为逆操作
  • 批量查询优于多次调用:一次传入多个 value 更高效
  • 用于百分位转换:rank / total_observations ≈ CDF(value)

*FAQ

Q1: RANK 和 REVRANK 有什么区别? A: RANK 返回"小于该值的个数"(从最小值开始数);REVRANK 返回"大于该值的个数"(从最大值开始数)。REVRANK ≈ total_count - RANK - 1。

Q2: 排名从 0 开始还是从 1 开始? A: 从 0 开始。RANK 返回的是小于该值的观测值数量,最小值的排名为 0。

Q3: 如果值不在数据集中,排名还有意义吗? A: 有意义。RANK 对任意值都有定义,返回的是该值在有序序列中的插入位置(小于它的元素个数)。