*Redis ZREVRANK 命令

返回 Sorted Set 中指定 member 的排名(score 从大到小,从 0 开始)。


*语法

ZREVRANK key member [WITHSCORE]

*参数说明

参数 类型 必填 说明
key String Sorted Set 的键名
member String 成员名
WITHSCORE 标志 同时返回 score(Redis 7.2+)

*返回值

条件 返回值
member 存在 排名(Integer),0 表示第一名(最高分)
member 不存在 nil

*时间复杂度

O(log(N))

*

*示例

> ZADD leaderboard 100 "p1" 200 "p2" 300 "p3"
(integer) 3

> ZREVRANK leaderboard "p3"
(integer) 0

> ZREVRANK leaderboard "p1"
(integer) 2

> ZREVRANK leaderboard "p4"
(nil)

*常见错误

错误 原因 解决
WRONGTYPE Operation against a key holding the wrong kind of value 对非 Sorted Set 类型执行 ZREVRANK 使用 TYPE 命令确认 key 类型为 zset
返回 nil 导致业务层异常 member 不存在于该 Sorted Set 业务层判空处理,或使用 EXISTS 检查 member 是否存在
ERR syntax error 低版本 Redis 使用 WITHSCORE 选项 Redis 7.2+ 才支持 WITHSCORE,低版本请升级或分两次查询
ERR wrong number of arguments 参数数量不足 确保传入 key 和 member 两个必填参数

*最佳实践

  1. 查询个人排名(高分优先):ZREVRANK 返回的排名 0 是最高分,符合常见排行榜习惯。

  2. WITHSCORE 一次查询:Redis 7.2+ 使用 WITHSCORE 同时获取排名和分数,减少往返次数。

  3. 处理 nil 返回值:业务层需处理 member 不存在时返回的 nil,避免空指针异常。

  4. 排名+1 展示:内部排名从 0 开始,展示给用户时通常 +1 转换为第 1 名、第 2 名。

*5. 缓存热门排名:对频繁查询的 member 排名结果做短期缓存,减少 Redis 查询压力。

*FAQ

Q1: ZREVRANK 和 ZRANK 怎么选择? A: 高分排名优先用 ZREVRANK(0=第一名);低分排名优先用 ZRANK(0=最低分)。

Q2: ZREVRANK 返回 nil 是什么意思? A: 表示指定的 member 不在该 Sorted Set 中。

Q3: ZREVRANK 和 ZRANK 的时间复杂度一样吗? A: 一样,都是 O(log(N))。只是排序方向相反。

Q4: 并列分数的成员排名怎么算? A: Redis 使用字典序对相同 score 的 member 进行次级排序,并列分数不会返回相同排名。

Q5: WITHSCORE 选项在低版本 Redis 中能用吗? A: 不能。WITHSCORE 是 Redis 7.2+ 才支持的选项,低版本会报错。