*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 表示最后一个。