Redis 怎样按分数范围读取有序集合
Redis 6.2 及以上可用 ZRANGE key min max BYSCORE 按分数范围读取有序集合。例如 ZRANGE article:score:demo 20 40 BYSCORE WITHSCORES,读取分数在 20 到 40 之间、包含两端的成员,并附带分数。没有 BYSCORE 时,两个数字表示排名位置,不是分数。
这种写法可以看作“按分数建立范围读取接口”:业务给出边界,Redis 返回符合范围的成员。它适合分数区间查询,却不天然等于稳定分页或一致性快照。下面只讨论边界、方向与 LIMIT,示例供读者在隔离实例执行,本文未运行命令,结果均为预期。
官方地址:https://redis.io/docs/latest/commands/zrange/
用分数区间表达业务范围
假设展示一个评分区间的条目,接口需要明确三个独立维度:分数范围、返回方向和数量上限。不要把“第 20 到第 40 名”和“20 到 40 分”复用为同一个不带模式说明的参数。
# 在隔离实例确认这个专用键不存在,再写入示例成员 # c 与 d 故意同分,用于观察并列成员的排序 redis-cli ZADD article:score:demo 10 a 20 b 30 c 30 d 40 e 50 f # 按分数范围读取闭区间,同时返回分数 redis-cli ZRANGE article:score:demo 20 40 BYSCORE WITHSCORES
预期成员顺序为 b、c、d、e,分数分别为 20、30、30、40。这里成员 c 和 d 的分数相同,但仍是两个不同成员。
这一接口的组成对象是有序集合、分数下界、分数上界、BYSCORE 模式、返回方向和匹配成员。BYSCORE 改变边界解释,返回方向改变排列方式,二者不能互相替代。

边界默认包含,排除时加左括号
普通分数边界是闭区间;在某个分数前加左括号,表示排除这一端。注意命令参数中没有配套的右括号。下面命令使用 shell 引号保护左括号,避免它被 shell 当作语法。
# 20
相邻时间段或分数段不想重复端点时,可明确采用半开区间,而不是临时加减一个猜测的极小值。用浮点分数时,随意减 0.0001 并不能普遍等价于排除端点。
若想只取 30 分,使用两个相同的包含边界:30 30 BYSCORE。这将包含 c 和 d,不需要把分数转成成员字符串去匹配。
降序读取必须交换两端参数
按分数升序时,参数是下界在前、上界在后;加 REV 改成降序后,要改成上界在前、下界在后。不能只在原命令尾部追加 REV 而保留边界次序。
# 分数从高到低,范围仍为 20 到 40,包含两端 # 预期成员顺序为 e、d、c、b redis-cli ZRANGE article:score:demo 40 20 BYSCORE REV WITHSCORES # 排除上界 40,仍包含下界 20;预期为 d、c、b redis-cli ZRANGE article:score:demo '(40' 20 BYSCORE REV # 全分数范围降序读取,但只拿前三个成员 redis-cli ZRANGE article:score:demo +inf -inf BYSCORE REV LIMIT 0 3
同分成员在升序下按成员的字节字典序排列,加 REV 后同分次序也反转,所以 30 分的 c、d 在降序中成为 d、c。它不是按写入先后排序,更不是按中文拼音或数字字符串的数值大小排序。
因此,成员名为数字字符串时,不能假设“2 一定在 10 前面”。如果业务要按另一个字段打破同分,需要在数据设计中明确编码或另行处理,不能把同分排序留给调用方猜测。
LIMIT 限的是匹配区间,不是全集合
LIMIT offset count 表示在符合范围且按指定方向排列的成员中,跳过 offset 个,再最多取 count 个。offset 从 0 开始;count 是成员数,而不是 WITHSCORES 展示出来的文本行数。
# 匹配序列预期为 b、c、d、e;跳过 b,再取 c、d redis-cli ZRANGE article:score:demo 20 40 BYSCORE LIMIT 1 2 WITHSCORES # 降序匹配序列预期为 e、d、c、b;跳过 e,再取 d、c redis-cli ZRANGE article:score:demo 40 20 BYSCORE REV LIMIT 1 2 WITHSCORES
WITHSCORES 增加的是返回信息,不改变排序键,也不把 count 翻倍。客户端可能返回成员与分数的成对结构,命令行则常逐项显示;应用按驱动的数据结构读取,不按屏幕行数推算成员数量。
读少量区间数据时,范围读取加小 LIMIT 是紧凑写法。不过 LIMIT 不代表服务器一定只访问 count 个成员:为了跳过很大的 offset,仍可能需要遍历大量匹配成员。

把偏移分页当作稳定游标会出问题
连续使用 offset 0、2、4,只是在每次查询当时的匹配序列上取片段。若两页之间插入、删除成员或改变分数,后面的偏移位置可能移动,从而出现重复或遗漏。单次命令的读取不意味着多个请求共享快照。
只记最后一个分数也不能解决全部问题。例如在本样例取 20 40 BYSCORE LIMIT 0 2,先得到 b 和 c;如果下一页直接从排除 30 的边界开始,会漏掉同为 30 分的 d。改成包含 30 又可能重复 c。
所以,“分数范围 + LIMIT”适合受控的小范围读取与接受数据变化的浅分页;需要可靠续读时,必须明确同分成员位置与并发变更策略。本文不提供一个只存分数就宣称无重漏的游标公式,也不建议为了减少漏读而无限扩大单次返回量。
按边界、方向和数量逐项选写法
| 需求 | 参数组合 | 注意事项 |
|---|---|---|
| 升序闭区间 | min max BYSCORE | 分数不是排名 |
| 升序排除下界 | (min max BYSCORE | shell 中给左括号参数加引号 |
| 降序闭区间 | max min BYSCORE REV | 边界次序也要换 |
| 区间前若干成员 | LIMIT 0 count | 返回的是成员数量 |
| 成员附带分数 | WITHSCORES | 不改变成员排序 |
旧版 Redis 不支持 BYSCORE 怎么办?
ZRANGE 的 BYSCORE、REV 等扩展从 6.2 开始提供。旧环境应按版本使用 ZRANGEBYSCORE 或 ZREVRANGEBYSCORE,后者的边界也是上界在前;不要认为基础 ZRANGE 的早期可用版本代表这些选项同样可用。
没有结果就是命令错了吗?
不一定。范围内无成员、升降序边界次序写反或 LIMIT 偏移超过匹配数量,都可能得到空集合。先看选项与边界,再看样例数据;真正的类型或语法错误要走客户端错误分支,不能统一转换成空列表。
count 写负数能表示不限量吗?
官方支持负数 count,表示返回 offset 之后的全部匹配成员。业务接口仍应控制可接受返回量,不把这个能力开放成默认无上限读取。
这套模式的取舍是:用一条命令准确表达分数范围,用明确方向和小返回上限控制读量;一旦需求变成跨请求稳定续读,就必须补充成员身份和数据变化约束,不能只增加 offset。
官方参考:https://redis.io/docs/latest/commands/zrange/;官方命令文档源 https://github.com/redis/redis-doc/blob/master/commands/zrange.md。
Redis SMISMEMBER 怎样一次判断多个成员
- 上一篇
- Redis SMISMEMBER 怎样一次判断多个成员
- 下一篇
- Redis 消费者组怎样自动认领超时消息
-
- 数据库 · Redis | 1小时前 |
- Redis WATCH 怎样在并发修改时放弃事务
- 486浏览 收藏
-
- 数据库 · Redis | 1小时前 | Redis · redis Pub/Sub Redis Cluster SSUBSCRIBE
- Redis shard Pub/Sub 怎样订阅分片频道
- 162浏览 收藏
-
- 数据库 · Redis | 1小时前 | redis idle pending XINFO CONSUMERS inactive Stream消费者组
- Redis XINFO CONSUMERS 的 idle 与 inactive 字段区分指南
- 182浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis LMOVE 怎样把列表元素转移到另一端
- 420浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis HSCAN 怎样按模式增量读取字段
- 282浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis SET 怎样在写入时返回旧值
- 100浏览 收藏
-
- 数据库 · Redis | 13小时前 | Redis · 数据库 · 分页 · redis groupby limit reduce Redis Search FT.AGGREGATE SORTBY
- Redis Search 怎样按字段聚合结果
- 162浏览 收藏
-
- 数据库 · Redis | 13小时前 |
- Redis 向量检索怎样选择距离度量
- 159浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 521次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 578次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 604次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 554次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 375次使用
-
- Redis Stream XTRIM 如何避免消费组积压无限增长
- 2026-09-12 501浏览
-
- Redis AOF rewrite 期间如何判断磁盘与内存压力
- 2026-09-12 501浏览
-
- Redis RDB 和 AOF 怎么按可接受数据丢失量选择
- 2026-09-08 501浏览
-
- Redis XAUTOCLAIM 之后为什么仍有 pending:JUSTID、PEL 与消息删除边界
- 2026-08-29 501浏览
-
- Redis SET 的 GET 与 KEEPTTL 怎么一起验收:旧值返回、续期与回滚边界
- 2026-08-20 501浏览
