ZRANGE

Syntax
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count]
  [WITHSCORES]
Available since:
1.2.0
Time complexity:
O(log(N)+M) with N being the number of elements in the sorted set and M the number of elements returned.
ACL categories:
@read, @sortedset, @slow,

返回存储在中的有序集合的指定范围内的元素。

ZRANGE 可以执行不同类型的范围查询:按索引(排名)、按分数或按字典顺序。

从 Redis 6.2.0 开始,此命令可以替换以下命令:ZREVRANGEZRANGEBYSCOREZREVRANGEBYSCOREZRANGEBYLEXZREVRANGEBYLEX

常见行为和选项

元素的顺序是从最低分到最高分。具有相同分数的元素按字典顺序排列。

可选的 REV 参数会反转排序顺序,因此元素会从最高分到最低分排序,分数相同的情况下会按反向字典顺序解决。

可选的LIMIT参数可用于从匹配元素中获取子范围(类似于SQL中的SELECT LIMIT offset, count)。 负数的会返回从开始的所有元素。请记住,如果很大,排序集需要遍历个元素才能到达要返回的元素,这可能会增加O(N)的时间复杂度。

可选的 WITHSCORES 参数通过返回元素的分数来补充命令的回复。返回的列表包含 value1,score1,...,valueN,scoreN 而不是 value1,...,valueN。客户端库可以自由返回更合适的数据类型(建议:一个包含(值,分数)数组/元组的数组)。

索引范围

默认情况下,该命令执行索引范围查询。 参数表示从零开始的索引,其中 0 是第一个元素,1 是下一个元素,依此类推。这些参数指定了一个包含范围,因此例如,ZRANGE myzset 0 1 将返回有序集合中的第一个和第二个元素。

索引也可以是负数,表示从排序集合末尾开始的偏移量,其中-1表示排序集合的最后一个元素,-2表示倒数第二个元素,依此类推。

超出范围的索引不会产生错误。

如果 大于排序集合的结束索引或 ,则返回一个空列表。

如果大于有序集合的结束索引,Redis将使用有序集合的最后一个元素。

分数范围

当提供BYSCORE选项时,该命令的行为类似于ZRANGEBYSCORE,并返回排序集合中分数等于或介于之间的元素范围。

可以是 -inf+inf,分别表示负无穷和正无穷。这意味着你不需要知道排序集合中的最高或最低分数来获取从某个分数开始或到某个分数的所有元素。

默认情况下,由指定的分数区间是闭区间(包含端点)。 可以通过在分数前加上字符(来指定开区间(不包含端点)。

例如:

ZRANGE zset (1 5 BYSCORE

将返回所有满足 1 < score <= 5 的元素,同时:

ZRANGE zset (5 (10 BYSCORE

将返回所有5 < score < 10(不包括5和10)的元素。

反向范围

使用REV选项可以反转排序集合,索引0为得分最高的元素。

默认情况下, 必须小于或等于 才能返回任何内容。 然而,如果选择了 BYSCOREBYLEX 选项, 是要考虑的最高分数,而 是要考虑的最低分数,因此 必须大于或等于 才能返回任何内容。

例如:

ZRANGE zset 5 10 REV

将返回反转索引中索引5到10之间的元素。

ZRANGE zset 10 5 REV BYSCORE

将返回所有分数小于10且大于5的元素。

词典范围

当使用BYLEX选项时,该命令的行为类似于ZRANGEBYLEX,并返回排序集合中在字典序闭区间之间的元素范围。

请注意,字典序排序依赖于所有元素具有相同的分数。当元素具有不同的分数时,回复是未指定的。

有效的 必须以 ([ 开头,以便分别指定范围区间是排他的还是包含的。

的特殊值 +- 分别表示正无穷和负无穷的字符串,因此例如命令 ZRANGE myzset - + BYLEX 保证会返回有序集合中的所有元素,前提是所有元素的分数相同。

REV 选项会反转 元素的顺序,其中 必须在字典序上大于 才能产生非空结果。

字符串的字典序比较

字符串被比较为字节的二进制数组。由于ASCII字符集的指定方式,这通常意味着以明显的字典方式比较普通ASCII字符。然而,如果使用非纯ASCII字符串(例如,utf8字符串),则情况并非如此。

然而,用户可以应用一个转换到编码字符串上,以便插入到排序集合中的元素的第一部分将按照用户对特定应用程序的要求进行比较。例如,如果我想添加将以不区分大小写的方式进行比较的字符串,但我仍然希望在查询时检索到真实的大小写,我可以以下列方式添加字符串:

ZADD autocomplete 0 foo:Foo 0 bar:BAR 0 zap:zap

由于每个元素中的第一个标准化部分(在冒号字符之前),我们强制进行给定的比较。然而,在使用ZRANGE ... BYLEX查询范围后,应用程序可以向用户显示冒号后的字符串的第二部分。

比较的二进制性质允许使用排序集作为通用索引,例如,元素的第一部分可以是一个64位的大端数。由于大端数在初始位置具有最高有效字节,二进制比较将匹配数字的数值比较。这可以用于实现对64位值的范围查询。如下例所示,在前8个字节之后,我们可以存储我们正在索引的元素的值。

示例

以下示例使用WITHSCORES展示了该命令如何始终返回一个数组,但这次填充了element_1score_1element_2score_2、...、element_Nscore_N

此示例展示了如何按分数查询排序集,排除值 1 并直到无穷大,仅返回结果的第二个元素:

在交互式控制台中尝试这些命令:

ZADD myzset 1 "one" 2 "two" 3 "three" ZRANGE myzset 0 -1 ZRANGE myzset 2 3 ZRANGE myzset -2 -1

RESP2/RESP3 回复

Array reply: a list of members in the specified range with, optionally, their scores when the WITHSCORES option is given.

历史

  • 从 Redis 6.2.0 版本开始:添加了 REVBYSCOREBYLEXLIMIT 选项。
RATE THIS PAGE
Back to top ↑