Redis Sorted Set 怎样删除指定排名范围
如果你要清理 Redis Sorted Set 中“排名第几到第几”的成员,直接使用 ZREMRANGEBYRANK key start stop。这里的排名从 0 开始,start 和 stop 都包含在删除范围内;也可以用负数从最高分一侧倒数,例如 -1 表示最高分成员。
官方地址:https://redis.io/docs/latest/commands/zremrangebyrank/
例如,ZREMRANGEBYRANK leaderboard 0 1 会删除最低分侧的前两项,ZREMRANGEBYRANK leaderboard -2 -1 会删除最高分侧的两项。命令返回实际删除的成员数量;若范围为空或没有匹配成员,返回值就是 0。
先把 Sorted Set 看成一条排名坐标
Sorted Set 的 member 按 score 升序排列,排名不是从 1 开始,而是从 0 开始。下面这组数据中,alpha 的排名是 0,delta 的排名是 3;同分时 Redis 还会按 member 的字典序排列,所以不要只凭 score 猜排名。
# 写入一组示例成员;score 越小,正向排名越靠前。 redis-cli ZADD leaderboard 10 alpha 20 beta 30 gamma 40 delta # 读取成员和 score,先确认当前的排名坐标。 redis-cli ZRANGE leaderboard 0 -1 WITHSCORES

用 ZREMRANGEBYRANK 删除正向排名区间
命令的固定形式是 ZREMRANGEBYRANK key start stop。其中 start 和 stop 都是零基、闭区间索引;因此删除排名 1 到 2 时,实际会删除两名成员。
# 删除排名 1 和 2,两个端点都包含在内。 redis-cli ZREMRANGEBYRANK leaderboard 1 2 # 返回删除数量后,再读取集合确认剩余成员。 redis-cli ZRANGE leaderboard 0 -1 WITHSCORES
如果集合原本是 alpha、beta、gamma、delta,这条命令会删除 beta 和 gamma,保留两端的 alpha 与 delta。不要把 stop 当成排他边界,否则很容易少删一个成员。
清理最高分或保留头部时使用负排名
负排名从最高分端开始计算:-1 是最高分,-2 是第二高分。这样做的好处是集合长度变化后,清理“最后几名”仍然不需要先计算总数。
# 删除最高分侧的两名成员,-2 和 -1 都包含。 redis-cli ZREMRANGEBYRANK leaderboard -2 -1 # 只保留最低分侧的前 100 名,排名 100 以后全部清理。 redis-cli ZREMRANGEBYRANK leaderboard 100 -1
第二条命令的含义是删除排名 100 到末尾的所有成员,因此执行后最多保留排名 0 到 99 的 100 项。若集合不足 101 项,命令可能返回 0,因为没有成员落在这个范围内。

按排名删除和按 score 删除不要混用
ZREMRANGEBYRANK 依据的是位置,ZREMRANGEBYSCORE 依据的是 score 数值。比如“删除最低的 20 名”适合按 rank;“删除 score 小于 100 的成员”则应按 score。两种条件看起来相近,但在并列分数或集合不断变化时结果不同。
| 目标 | 命令 | 边界语义 |
|---|---|---|
| 删除排名区间 | ZREMRANGEBYRANK | 零基、按位置、两端包含 |
| 删除最高分侧末尾几项 | ZREMRANGEBYRANK key -n -1 | 负排名从最高分倒数 |
| 删除 score 区间 | ZREMRANGEBYSCORE | 按数值范围判断 |
| 删除指定 member | ZREM | 按成员名精确删除 |
当需求是固定容量排行榜时,常见做法是写入新成员后用 ZREMRANGEBYRANK key 0 -101 清理低分侧,让集合保留最高 100 名。这个范围是否正确取决于你的排序方向和“保留多少项”的定义,发布到生产前应先用一组小数据画出排名坐标。
用返回值和读取结果确认清理边界
这个命令的返回值是删除的成员数,不是删除后的集合长度。要判断边界是否符合预期,先记录命令返回值,再用 ZRANGE key 0 -1 WITHSCORES 读取剩余成员。整个操作的复杂度是 O(log(N)+M),其中 N 是集合大小,M 是删除数量。
# 删除排名 0 到 9,并把返回的删除数量交给调用方记录。 redis-cli ZREMRANGEBYRANK leaderboard 0 9 # 读取剩余成员;空结果表示集合已没有成员。 redis-cli ZRANGE leaderboard 0 -1 WITHSCORES # 读取集合数量,用于和业务保留数量做对照。 redis-cli ZCARD leaderboard
如果整组成员都被删掉,Redis 会删除这个 Sorted Set key。批量清理数量很大时,应该把删除任务纳入业务低峰和慢命令监控;如果只需要弹出少量最高或最低成员,也可以比较 ZPOPMAX 或 ZPOPMIN 是否更符合“读取并删除”的语义。
常见问题
start 和 stop 是从 1 还是从 0 开始?
从 0 开始,并且 stop 也包含。删除第 1 个到第 3 个成员时,应写成 0 2,而不是 1 3。
为什么 -1 代表最高分?
负排名从集合末尾倒数,-1 是最高分一项,-2 是第二高分。它适合描述“最后几项”,不需要先调用 ZCARD 计算正向下标。
按排名删除会不会删除同分成员的一部分?
会。排名先由 score 决定,同分时再按 member 字典序决定位置;命令最终删除的是落在索引区间内的成员,不会把相同 score 自动视为一个整体。
返回 0 是否说明 key 一定不存在?
不一定。key 不存在、范围没有命中成员,或者起止范围与当前集合不相交,都可能返回 0。若业务需要区分这些情况,应在执行前结合 EXISTS、ZCARD 或读取结果判断。
参考入口:https://redis.io/docs/latest/commands/zremrangebyrank/;Sorted Set 数据结构说明:https://redis.io/docs/latest/develop/data-types/sorted-sets/。
Redis JSON 查询怎样限制返回字段
- 上一篇
- Redis JSON 查询怎样限制返回字段
- 下一篇
- Redis PUBSUB NUMPAT 统计模式订阅数量的使用方法
-
- 数据库 · Redis | 8分钟前 |
- Redis TTL 为什么会变成 -1
- 370浏览 收藏
-
- 数据库 · Redis | 8分钟前 | redis acl 最小权限 ACL SETUSER 键前缀 %R~ %W~
- Redis ACL 怎样只允许键前缀操作
- 496浏览 收藏
-
- 数据库 · Redis | 11分钟前 | Redis · redis Lua eval SCRIPT KILL busy-reply-threshold 批量游标
- Redis Lua 脚本怎样限制单次执行范围
- 246浏览 收藏
-
- 数据库 · Redis | 12分钟前 |
- Redis PUBSUB NUMPAT 统计模式订阅数量的使用方法
- 322浏览 收藏
-
- 数据库 · Redis | 18分钟前 |
- Redis JSON 查询怎样限制返回字段
- 312浏览 收藏
-
- 数据库 · Redis | 23分钟前 |
- Redis Set 怎样计算多个集合的差集
- 245浏览 收藏
-
- 数据库 · Redis | 25分钟前 | Redis · Stream · redis Redis Stream 消费组 XPENDING XAUTOCLAIM pending
- Redis Stream 怎样处理 pending 消息转移
- 367浏览 收藏
-
- 数据库 · Redis | 27分钟前 |
- Redis ZREMRANGEBYRANK 怎样删除有序集合的最低排名成员
- 136浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis OBJECT ENCODING 怎样确认集合的底层编码
- 225浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis LOLWUT 的 VERSION 参数会改变服务器版本吗
- 392浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis CLIENT LIST TYPE 怎样筛选连接类型
- 307浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 931次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 937次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 1040次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 1016次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 844次使用
-
- Go与Redis实现分布式互斥锁和红锁
- 2022-12-22 117浏览
-
- Go+Redis实现延迟队列实操
- 2023-02-23 426浏览
-
- 一文搞懂Go语言操作Redis的方法
- 2023-01-07 171浏览
-
- Golang分布式应用之Redis示例详解
- 2023-01-07 113浏览
-
- Go Redis客户端使用的两种对比
- 2022-12-30 195浏览

