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 缓存才合理。