*Redis TDIGEST.BYRANK 命令

TDIGEST.BYRANK 根据给定的排名(从 0 开始),返回对应的观测值。用于反向排名查询。


*语法

TDIGEST.BYRANK key rank [rank ...]

*参数说明

参数 类型 必填 说明
key String t-digest 键名
rank Integer 排名值(从 0 开始),支持多个

*返回值

  • Array:对应排名的观测值数组(从低到高排序)
  • Empty array:无数据时返回空数组
  • Error:key 不存在、类型错误或参数错误

*时间复杂度

O(log(N)),N 为 t-digest 中合并节点的数量。


*示例

*基本用法

> TDIGEST.CREATE temp
OK
> TDIGEST.ADD temp 10 20 30 40 50
OK
> TDIGEST.BYRANK temp 0
1) "10"
> TDIGEST.BYRANK temp 2
1) "30"

*查询多个排名

> TDIGEST.CREATE scores
OK
> TDIGEST.ADD scores 5 10 15 20 25 30 35 40 45 50
OK
> TDIGEST.BYRANK temp 0 2 4 6 8
1) "5"
2) "15"
3) "25"
4) "35"
5) "45"

*越界查询

> TDIGEST.BYRANK temp 100
1) "50"

*常见错误

错误 原因 解决
ERR wrong number of arguments 未提供 key 或 rank 检查参数数量
ERR key does not exist key 不存在 确认 key 已创建并添加数据
WRONGTYPE key 不是 t-digest 检查 key 的数据类型
ERR value is not an integer rank 非整数 确保 rank 为整数

*最佳实践

  • 结合 TDIGEST.RANK 使用:RANK 查值对应的排名,BYRANK 查排名对应的值,两者互为逆操作
  • 处理越界:当 rank >= 数据总量时,返回最大值(不会报错)
  • 批量查询优于多次调用:一次传入多个 rank 比多次单 rank 查询更高效

*FAQ

Q1: BYRANK 和 QUANTILE 有什么区别? A: BYRANK 按排名(0-based count)返回值;QUANTILE 按分位比例(0~1)返回值。rank = quantile × total_count。

Q2: 排名从 0 开始还是从 1 开始? A: 从 0 开始,rank=0 对应最小值。

Q3: 数据量很少时精度如何? A: t-digest 是近似算法,数据量越小精度越高;数据量大时保持较好的近似精度。