*Redis ZRANGESTORE 命令

ZRANGESTORE 将有序集合指定排名范围内的成员保存到目标集合中。


*语法

ZRANGESTORE dst src min max [BYSCORE | BYLEX] [REV] [LIMIT offset count]

*参数说明

参数 类型 必填 说明
dst String 目标集合键名
src String 源有序集合键名
min String/Integer 范围起始。BYSCORE 时是最小分数,BYLEX 时是最小字典序
max String/Integer 范围结束。BYSCORE 时是最大分数,BYLEX 时是最大字典序
BYSCORE Flag 按分数范围查询
BYLEX Flag 按字典序范围查询(要求分数相同)
REV Flag 反向排序(高分/字典序大到小在前)
LIMIT offset count Integer 分页参数,offset 偏移量,count 返回数量

*返回值

  • Integer:保存到目标集合的成员数量
  • Error:键类型错误、范围格式错误

*时间复杂度

O(log(N) + M),其中:

  • N 为源集合基数
  • M 为返回的成员数量

*示例

*按排名范围保存

> ZADD src 10 "a" 20 "b" 30 "c" 40 "d" 50 "e"
(integer) 5
> ZRANGESTORE dst src 1 3
(integer) 3
> ZRANGE dst 0 -1 WITHSCORES
1) "b"
2) "20"
3) "c"
4) "30"
5) "d"
6) "40"

*按分数范围保存

> ZRANGESTORE dst2 src 20 40 BYSCORE
(integer) 3
> ZRANGE dst2 0 -1
1) "b"
2) "c"
3) "d"

*反向范围保存

> ZRANGESTORE dst3 src 0 2 REV
(integer) 3
> ZRANGE dst3 0 -1
1) "e"
2) "d"
3) "c"

*常见错误

错误 原因 解决
WRONGTYPE src 不是有序集合 检查源集合类型
ERR syntax error BYSCORE/BYLEX 格式冲突 不能同时使用 BYSCORE 和 BYLEX
ERR value is not an integer LIMIT 参数非整数 offset 和 count 需为整数

*最佳实践

  • 场景:排行榜切片保存、分数段归档、字典序段提取、排行榜分页缓存
  • dst 存在时会被覆盖,注意数据安全
  • BYSCORE 配合 LIMIT 可实现高性能分页,避免客户端全量加载
  • REV 用于获取高分段(如 Top 10)直接保存
  • 大集合切片时注意 M 的大小,避免内存峰值

*FAQ

Q1: ZRANGESTORE 和 ZRANGE 有什么区别? A: ZRANGE 只返回结果不保存;ZRANGESTORE 将结果持久化到新集合。

Q2: dst 已存在会怎样? A: 会被覆盖为新的有序集合,旧内容丢失。

Q3: 支持 BYRANK 吗? A: 默认就是按排名(BYRANK),不需要显式声明。