ZREVRANGE 是什么
ZREVRANGE 从有序集合中按分数从高到低取成员:ZREVRANGE key 0 9 WITHSCORES 就是 Top10,索引从 0 开始、-1 表示最后一个。它按排名取数,与按分数区间取数的 ZREVRANGEBYSCORE 是两类用法。旧命令族至今仍被广泛使用,Redis 6.2 起也可以用 ZRANGE key start stop REV 达到同样效果。
基本信息
| 适用版本 | ZREVRANGE 全版本;ZRANGE 加 REV 参数需 6.2+ |
|---|---|
| 语法 | ZREVRANGE key start stop [WITHSCORES] |
| 索引约定 | 0 为第一名,-1 为最后一名 |
| 耗时特征 | O(logN + M),M 为返回元素个数 |
| 相关命令 | ZREVRANK / ZREVRANGEBYSCORE / ZCOUNT / ZINCRBY |
典型使用场景
- 排行榜 TopN:取前 10 名并带上分数直接渲染
- 榜单分页:按页计算 start 与 stop,避免一次取回全部成员
- 并列名次核对:用 ZREVRANK 查某个成员的具体名次
- 区间倒序:用 ZREVRANGEBYSCORE key +inf -inf LIMIT 0 10 按分数倒序取
- 成绩累计:用 ZINCRBY 更新分数后立即读取最新排名
- 定长榜单:配合 ZREMRANGEBYRANK 只保留前 N 名,控制内存
示例
示例
ZADD board 100 u1 200 u2 300 u3
ZREVRANGE board 0 1 # 返回 u3 u2(分数最高的两个)
ZREVRANGE board 0 1 WITHSCORES # 返回 u3 300 u2 200
ZREVRANGEBYSCORE board +inf -inf LIMIT 0 10 # 按分数降序取前 10
ZREVRANK board u1 # 返回 2,即倒序第 3 名
ZCOUNT board 200 300 # 分数在区间内的成员数
ZREMRANGEBYRANK board 100 -1 # 只保留前 100 名,防止榜单无限增长命令对照
| 命令 | 排序与取值 | 典型用途 |
|---|---|---|
| ZREVRANGE | 按排名倒序取区间 | TopN 与分页 |
| ZRANGE | 按排名顺序取,6.2+ 可加 REV | 从小到大取榜尾或低分列表 |
| ZREVRANGEBYSCORE | 按分数区间倒序取 | 只要高分区间、忽略名次 |
| ZREVRANK | 查成员倒序名次 | 显示「当前第几名」 |
同分并列时按成员字典序排列:想要「先到先得」的并列顺序,需要把时间戳作为分数的小数部分或改用复合分数。
ZREVRANGE 的耗时随返回元素数增长,用 0 -1 取全量榜单在大集合上是危险操作;分页取数或用 ZREMRANGEBYRANK 维护定长榜单更稳妥。
ZREVRANGE 的分页参数是排名区间而非页码:第 N 页对应 start 为 N 减 1 乘每页条数、stop 为 start 加条数减 1;榜单实时变化时相邻页之间可能出现重复成员,导出与对账应改用分数区间加游标。
ZREVRANGE 与 ZREVRANK 返回的名次都是 0 基,展示给用户时要加 1;两者混用时最容易出现「第 0 名」这类一眼可见的错误。