ZRANGE
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
- 从以下位置开始可用:
- 1.2.0
- 时间复杂度:
- O(log(N)+M),其中 N 是排序集中的元素数,M 是返回的元素数。
- ACL 类别:
-
@read
,@sortedset
,@slow
,
返回存储在<key>
.
ZRANGE
可以执行不同类型的范围查询:按索引 (排名)、按分数或按字典顺序。
从 Redis 6.2.0 开始,此命令可以替换以下命令:ZREVRANGE
,ZRANGEBYSCORE
,ZREVRANGEBYSCORE
,ZRANGEBYLEX
和ZREVRANGEBYLEX
.
常见行为和选项
元素的顺序是从最低到最高。具有相同分数的元素按字典顺序排序。
可选的REV
argument 反转了排序,因此元素按从最高到最低的顺序排序,分数平局通过反向字典排序来解决。
可选的LIMIT
参数可用于从匹配的元素中获取子范围(类似于 SQL 中的 SELECT LIMIT offset、count)。
否定的<count>
返回<offset>
.请记住,如果<offset>
较大,则需要遍历<offset>
元素,这会增加 O(N) 时间复杂度。
可选的WITHSCORES
参数使用返回的元素分数补充命令的回复。返回的列表包含value1,score1,...,valueN,scoreN
而不是value1,...,valueN
.客户端库可以自由返回更合适的数据类型(建议:具有 (value, score) 数组/元组的数组)。
索引范围
默认情况下,该命令执行索引范围查询。这<start>
和<stop>
参数表示从零开始的索引,其中0
是第一个元素,1
是下一个元素,依此类推。这些参数指定一个包含范围,例如,ZRANGE myzset 0 1
将返回排序集的第一个和第二个元素。
索引也可以是负数,表示与排序集末尾的偏移量,其中-1
作为有序集合的最后一个元素,-2
倒数第二个元素,依此类推。
超出范围的索引不会产生错误。
如果<start>
大于排序集的结束索引或<stop>
,则返回一个空列表。
如果<stop>
大于排序集的结束索引,Redis 将使用排序集的最后一个元素。
分数范围
当BYSCORE
选项,则命令的行为类似于ZRANGEBYSCORE
并返回排序集中分数等于或介于<start>
和<stop>
.
<start>
和<stop>
可以是-inf
和+inf
,分别表示负无穷大和正无穷大。这意味着您不需要知道排序集中的最高或最低分数,即可从或最高某个分数获取所有元素。
默认情况下,由<start>
和<stop>
已关闭(含)。
可以通过在分数前加上前缀来指定开放间隔(不包括)
替换为字符 .(
例如:
ZRANGE zset (1 5 BYSCORE
将返回所有元素1 < score <= 5
而:
ZRANGE zset (5 (10 BYSCORE
将返回所有元素5 < score < 10
(不包括 5 和 10)。
反转范围
使用REV
选项反转排序集,索引 0 作为得分最高的元素。
默认情况下,<start>
必须小于或等于<stop>
返回任何内容。
但是,如果BYSCORE
或BYLEX
选项中,则<start>
是要考虑的最高分数,并且<stop>
是要考虑的最低分数,因此<start>
必须大于或等于<stop>
才能返回任何内容。
例如:
ZRANGE zset 5 10 REV
将返回反向索引中索引 5 和 10 之间的元素。
ZRANGE zset 10 5 REV BYSCORE
将返回分数小于 10 且大于 5 的所有元素。
词典范围
当BYLEX
选项,则命令的行为类似于ZRANGEBYLEX
并返回<start>
和<stop>
字典式闭合范围间隔。
请注意,字典顺序依赖于具有相同分数的所有元素。当元素具有不同的分数时,回复未指定。
有效<start>
和<stop>
必须以 或 开头,以便指定
Range Interval 是 Exclusive 还是 Inclusive。(
[
或 的特殊值+
-
<start>
和<stop>
分别表示正数和负数无限字符串,例如命令ZRANGE myzset - + BYLEX
保证返回 Sorted Set 中的所有元素,前提是所有元素具有相同的 score。
这REV
options 会反转<start>
和<stop>
元素,其中<start>
必须按字典顺序大于<stop>
以生成非空结果。
字符串的字典比较
字符串作为字节的二进制数组进行比较。由于 ASCII 字符集的指定方式,这意味着这通常还具有以明显的字典方式比较普通 ASCII 字符的效果。但是,如果使用非纯 ASCII 字符串(例如 utf8 字符串),则情况并非如此。
但是,用户可以对编码的字符串应用转换,以便插入到排序集中的元素的第一部分将根据用户对特定应用程序的要求进行比较。例如,如果我想 添加将以不区分大小写的方式进行比较的字符串,但我仍然 想在查询时检索真实情况,我可以在 以下方式:
ZADD autocomplete 0 foo:Foo 0 bar:BAR 0 zap:zap
由于每个元素中的第一个规范化部分(在冒号字符之前),我们强制进行给定的比较。但是,在使用ZRANGE ... BYLEX
,则应用程序可以向用户显示字符串的第二部分,即冒号之后。
比较的二进制性质允许使用排序集作为通用索引,例如,元素的第一部分可以是 64 位 big-endian number。由于 big-endian 数字在初始位置具有最高有效字节,因此二进制比较将与数字的数字比较匹配。这可用于对 64 位值实施范围查询。如下例所示,在前 8 个字节之后,我们可以存储要索引的元素的值。
例子
The following example using WITHSCORES
shows how the command returns always an array, but this time, populated with element_1, score_1, element_2, score_2, ..., element_N, score_N.
This example shows how to query the sorted set by score, excluding the value 1
and up to infinity, returning only the second element of the result:
Give these commands a try in the interactive console:
RESP2/RESP3 Reply
Array reply: a list of members in the specified range with, optionally, their scores when the WITHSCORES option is given.
History
- Starting with Redis version 6.2.0: Added the
REV
, BYSCORE
, BYLEX
and LIMIT
options.