ZRANGE

语法
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count]
  [WITHSCORES]
可用版本
Redis 开源版 1.2.0
时间复杂度
O(log(N)+M),其中 N 是有序集合中的元素数量,M 是返回的元素数量。
ACL 类别
@read, @sortedset, @slow,

返回存储在 <key> 处的有序集合中指定范围的元素。

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

从 Redis 6.2.0 版本开始,此命令可以替代以下命令:ZREVRANGEZRANGEBYSCOREZREVRANGEBYSCOREZRANGEBYLEXZREVRANGEBYLEX

常见行为和选项

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

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

可选的 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> 才能返回任何结果。但是,如果选择了 BYSCOREBYLEX 选项,则 <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> 必须以 ([ 开头,分别指定范围区间是排他性还是包含性。

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

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

字符串的字典序比较

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

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

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

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

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

示例

以下使用 WITHSCORES 的示例展示了该命令如何始终返回一个数组,但这次填充了 元素_1分数_1元素_2分数_2、...、元素_N分数_N

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

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

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

RESP2/RESP3 回复

数组回复:指定范围内成员的列表,如果指定了 WITHSCORES 选项,则可选地包含其分数。

历史

  • 从 Redis 6.2.0 版本开始:添加了 REVBYSCOREBYLEXLIMIT 选项。
评价此页面
返回顶部 ↑