*Redis ZREMRANGEBYRANK 命令
ZREMRANGEBYRANK 移除有序集合中按排名(索引)范围的所有成员。
*语法
ZREMRANGEBYRANK key start stop
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 有序集合键名 |
| start | Integer | 是 | 起始排名(包含),0 为第一个 |
| stop | Integer | 是 | 结束排名(包含),-1 为最后一个 |
*返回值
- Integer:移除的成员数量
- Error:键类型错误、参数格式错误
*时间复杂度
O(log(N) + M),其中:
- N 为有序集合基数
- M 为移除的成员数量
*示例
*移除指定排名范围
> ZADD myzset 10 "a" 20 "b" 30 "c" 40 "d" 50 "e"
(integer) 5
> ZREMRANGEBYRANK myzset 1 3
(integer) 3
> ZRANGE myzset 0 -1
1) "a"
2) "e"
*只保留 Top N(移除低分段)
> ZADD scores 100 "p1" 90 "p2" 80 "p3" 70 "p4" 60 "p5"
(integer) 5
> ZREMRANGEBYRANK scores 0 -3
(integer) 3
> ZRANGE scores 0 -1 WITHSCORES
1) "p1"
2) "100"
3) "p2"
4) "90"
*使用负数索引
> ZADD myzset2 1 "x" 2 "y" 3 "z"
(integer) 3
> ZREMRANGEBYRANK myzset2 -2 -1
(integer) 2
> ZRANGE myzset2 0 -1
1) "x"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| WRONGTYPE | key 不是有序集合 | 检查 key 类型 |
| ERR value is not an integer | start/stop 非整数 | 使用整数排名 |
*最佳实践
- 场景:排行榜只保留 Top N、移除低分段数据、队列尾部清理
- 保留 Top 10:先 ZCARD 获取总数,再 ZREMRANGEBYRANK key 10 -1
- 移除大量成员时注意性能,建议在低峰期执行
- 与 ZREMRANGEBYSCORE 区分:按排名 vs 按分数范围
- 移除后集合为空不会自动删除 key,需要时手动 DEL
*FAQ
Q1: 排名范围是升序还是降序? A: 升序(分数从低到高),0 是最低分,-1 是最高分。
Q2: start > stop 会怎样? A: 返回 0,不移除任何成员。
Q3: 如何只保留前 100 名?
A: ZREMRANGEBYRANK key 100 -1。注意 -1 表示最后一个。