范围读取是什么
有序集合的范围读取命令可以按排名取值,也可以按分数取值。按排名时给出起始与结束下标并支持负数;按分数时切换为区间模式,可以用圆括号表示开区间,并可配合分页参数。较新版本把反转顺序也统一到这条命令里,旧的反向读取与按分数读取命令都能用统一写法表达,新代码只需要记一种。
基本信息
| 用途 | 按排名或分数区间读取有序集合 |
|---|---|
| 语法 | 范围读取 键 起始 结束 [WITHSCORES] [REV] [BYSCORE|BYLEX] [LIMIT 偏移 数量] |
| 排名模式 | 按下标取值,支持负数,零为分数最小的成员 |
| 分数模式 | 用区间边界表示,圆括号表示开区间 |
| 反转选项 | 直接降序输出,取榜首的常用写法 |
| 分页限制 | 分页参数只在分数或字典序模式下可用 |
典型使用场景
- 排行榜取前若干名与末若干名
- 取指定分数区间内的成员,例如某热度段的数据
- 分页浏览榜单:按分数区间配合分页参数
- 按时取延时任务:分数是时间戳,取到期范围
- 查看某个成员的排名与分数
- 反序取榜:让分数最高的排在最前
示例
示例
ZADD board 100 u1 200 u2 300 u3 # 写入三个成员
ZRANGE board 0 1 # 升序取前两个:u1 u2
ZRANGE board 0 -1 WITHSCORES # 全量并带分数
ZRANGE board 0 1 REV # 反序取前两个:u3 u2,才是真正的榜首
ZRANGE board (100 300 BYSCORE # 分数大于 100 且小于等于 300
ZRANGE board -inf +inf BYSCORE LIMIT 0 10 # 分数区间加前十条模式与返回读法
| 写法 | 含义 | 注意 |
|---|---|---|
| 键 0 1 | 按排名的升序前两名 | 分数最小的排在前面 |
| 键 0 1 REV | 反序前两名 | 取榜首的标准写法 |
| 键 0 -1 | 全部成员 | 大集合慎用 |
| 分数区间模式 | 按分数范围取成员 | 圆括号表示开区间 |
| 字典序模式 | 按成员字典序取 | 适用于同分或全同分场景 |
| 分页参数 | 分页返回 | 仅分数与字典序模式可用 |
| 带分数返回 | 结果附带分数 | 返回条数翻倍,注意解析 |
新旧命令的对应关系是:反向读取等价于加反转选项,按分数读取等价于切换为分数模式;新代码统一用范围读取命令,能减少记忆负担也便于统一封装。
忘记加反转选项会导致榜单取到分数最低的成员,这是排行榜实现里最高频的错误,取值之前先确认排序方向。
分页参数只在分数与字典序模式下可用,纯排名区间使用分页参数会直接报语法错误,需要改用分数区间来做分页。
范围读取检查清单
- 确认排序方向:升序还是反序
- 确认取值依据:按排名还是按分数
- 大集合避免全量读取,用区间与分页控制规模
- 带分数返回时注意结果条数翻倍
- 延时任务场景用当前时间作为区间边界
- 单成员排名查询使用专门的排名命令
按分数分页时把上一页的边界分数作为下一页起点,可以避开排名分页在数据变动时出现的重复与遗漏,前提是成员分数稳定或变化可控。
查询某个成员的具体名次要用专门的排名命令,范围读取只能给出成员列表与分数,用它反推名次既慢又不准,分布式环境下还要考虑排名口径。