首页/数据/数据库速查/ZRANK / ZREVRANK 名次查询
Redis 命令96 条

ZRANK / ZREVRANK 名次查询

查询成员排名:ZRANK 升序从 0 数,ZREVRANK 从高到低;7.2 起支持 WITHSCORE 一并返回分数。

数据库速查数据更新于 2026-10-13

ZRANK 是什么

ZRANK 与 ZREVRANK 用来查询有序集合成员的名次。ZRANK 按分数从低到高排名,ZREVRANK 从高到低排名,两者都返回 0 基下标:分数最小的成员名次是 0,而不是 1。成员不存在时返回 nil。复杂度为 O(log N),百万级成员也是毫秒级,是「我的排名」这类需求的标准实现。

基本信息

语法ZRANK key member [WITHSCORE] / ZREVRANK key member [WITHSCORE]
返回0 基名次;成员不存在返回 nil
复杂度O(log N)
版本WITHSCORE 需要 Redis 7.2 及以上
典型用途榜单名次、我的排名、相对位置比较

典型使用场景

  • 展示「我的排名」,配合 ZSCORE 一起给出分数
  • 在分页榜单里定位某个成员的相对位置,做前后名次对比
  • 活动运营核对名次变化,验证写入逻辑是否生效
  • 计算与榜首的分差,驱动「再得一票就能超过」这类文案
  • 排查名次异常:同一成员分数对但排名不对,通常是分数精度问题

名次查询

名次查询
ZADD board 100 u1 200 u2 300 u3
ZRANK board u1          # 0:升序,分数最小排第 0
ZREVRANK board u1       # 2:降序,真实榜单第 3 名
ZREVRANK board u3       # 0:榜首
ZREVRANK board u9       # (nil):成员不存在
ZREVRANK board u1 WITHSCORE        # 7.2+:一次拿到名次与分数
ZRANGE board 0 9 REV WITHSCORES    # 6.2+:直接取前十名(降序)

相关命令对比

命令顺序与返回使用建议
ZRANK分数升序,0 是最小者做「最差排名」或分数越低越优的场景
ZREVRANK分数降序,0 是最大者榜单名次默认用它
WITHSCORE额外返回分数7.2 起支持,省一次 ZSCORE 往返
ZRANGE ... REV按区间取降序列表6.2 起支持,适合取前 N 名
ZCOUNT按分数区间计数统计及格线以上人数等分段指标
展示名次时记得加 1:ZREVRANK 返回 0 基下标,榜首是 0,直接展示会少一名,这是最容易被测试漏掉的边界。
成员不存在返回 nil,前端必须处理「未上榜」分支;不要把 nil 当异常抛出,也不要用 0 兜底,否则未上榜用户会被显示成榜首。
名次是实时计算的结果,别人写入就会变。把名次缓存进业务表会立刻过期,展示层每次查询或使用很短的 TTL 缓存才合理。

易错点

  • 用 ZRANK 当榜单顺序:它是升序排名,榜单通常需要 ZREVRANK
  • 把 0 基下标当名次直接展示:忘加 1,每一名都少一位
  • 用 ZRANGE 0 -1 取全量再本地找名次:浪费带宽,大集合上还会长时间阻塞
  • 在 7.0 及以下环境使用 WITHSCORE:命令参数不被识别,脚本直接报错
  • 把名次直接用于分页计算且不做边界处理:名次随他人写入实时变化,翻页会出现重复或漏项

数据来源与参考

  • Redis 官方文档: ZRANK
  • Redis 官方文档: ZREVRANK

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌