# 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 开始,此命令可以替换以下命令: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将返回所有带有while的元素:

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>必须以(or开头[,以分别指定范围区间是独占还是包含。

+or -for<start>和的特殊值<stop>分别表示正负无限字符串,例如ZRANGE myzset - + BYLEX,如果所有元素具有相同的分数,则该命令保证返回排序集中的所有元素。

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

# 字符串的字典比较

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

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

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

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

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

# 返回

数组回复:指定范围内的元素列表(如果给出选项,可以选择它们的分数WITHSCORES)。

# 例子

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
redis> ZRANGE myzset 2 3
1) "three"
redis> ZRANGE myzset -2 -1
1) "two"
2) "three"
redis> 

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

redis> ZRANGE myzset 0 1 WITHSCORES
(empty array)
redis> 

这个例子展示了如何按分数查询排序集,不包括值1,直到无穷大,只返回结果的第二个元素:

redis> ZRANGE myzset (1 +inf BYSCORE LIMIT 1 1
(empty array)
redis> 

# 历史

  • 从 Redis 版本 6.2.0 开始:添加了、REVBYSCORE选项。BYLEX``LIMIT

# 反馈

如果您在此页面上发现问题,或有改进建议,请提交请求以合并或打开存储库中的问题。

Last Updated: 4/18/2023, 8:45:33 AM