*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),不需要显式声明。