持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
概述
返回存储在的有序集合中指定范围的元素。ZRANGE可以执行不同类型的范围查询:按索引(排名)、按分数或按字典顺序。从 Redis 6.2.0 开始,此命令可以替换以下命令:ZREVRANGE、ZRANGEBYSCORE、ZREVRANGEBYSCORE、ZRANGEBYLEX和ZREVRANGEBYLEX。
常见行为和选项
元素的顺序是从最低分到最高分。具有相同分数的元素按字典顺序排列。可选REV参数颠倒顺序,因此元素从最高分到最低分排序,并且分数关系通过反向词典排序来解决。可选LIMIT参数可用于从匹配元素中获取子范围(类似于SQL 中的SELECT LIMIT 偏移量、计数)。负数返回 中的所有元素。请记住,如果很大,则在到达要返回的元素之前需要遍历已排序的集合中的元素,这可能加起来为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 <= 5while返回所有元素:
ZRANGE zset (5 (10 BYSCORE
将返回带有5 < score < 10(5 和 10 除外)的所有元素。
字典范围
使用该BYLEX选项时,该命令的行为类似于ZRANGEBYLEX,并返回排序集中的元素范围和字典序闭区间区间。
请注意,字典顺序依赖于具有相同分数的所有元素。当元素具有不同的分数时,回复是未指定的。
有效且必须以(或开头[,以分别指定范围间隔是不包含还是包含。
+or-和的特殊值分别表示正和负无限字符串,因此例如命令ZRANGEBYLEX myzset - +保证返回排序集中的所有元素,前提是所有元素具有相同的分数。
字符串的字典序比较
字符串作为二进制字节数组进行比较。由于 ASCII 字符集的指定方式,这意味着通常这也具有以明显的字典方式比较普通 ASCII 字符的效果。但是,如果使用非纯 ASCII 字符串(例如 utf8 字符串),则情况并非如此。
但是,用户可以对编码字符串应用转换,以便插入到排序集中的元素的第一部分将按照用户对特定应用程序的要求进行比较。例如,如果我想添加会以不区分大小写的方式进行比较的字符串,但我在查询时仍然想检索真实的大小写,我可以通过以下方式添加字符串:
ZADD autocomplete 0 foo:Foo 0 bar:BAR 0 zap:zap 由于每个元素中的第一个标准化部分(在冒号字符之前),我们强制进行给定的比较。但是,在使用 查询范围后ZRANGE ... BYLEX,应用程序可以向用户显示字符串的第二部分,在冒号之后。
比较的二进制特性允许使用排序集作为通用索引,例如,元素的第一部分可以是 64 位大端数。由于 big-endian 数字在初始位置具有最高有效字节,因此二进制比较将匹配数字的数字比较。这可用于对 64 位值实施范围查询。如下例所示,在前 8 个字节之后,我们可以存储我们正在索引的元素的值。
返回值 数组回复:指定范围内的元素列表(如果WITHSCORES给出了选项,则可以选择带有它们的分数)。
历史
>= 6.2:增加了REV,BYSCORE,BYLEX和LIMIT选项。
例子
Redis> ZADD myzset 1“一”
(整数)1
Redis> ZADD myzset 2“二”
(整数)1
Redis> ZADD myzset 3“三”
(整数)1
Redis> ZRANGE myzset 0 -1
1)“一个”
2)“两个”
3)“三个”
Redis> ZRANGE myzset 2 3
1)“三个”
Redis> ZRANGE myzset -2 -1
1)“两个”
2)“三个”
Redis>
以下示例WITHSCORES显示了该命令如何始终返回一个数组,但这次使用element_1、score_1、element_2、score_2、...、element_N、score_N 填充。
Redis> ZRANGE myzset 0 1 WITHSCORES
1)“一个”
2)“1”
3)“两个”
4)“2”
Redis>
这个例子展示了如何查询按分数排序的集合,不包括值1,直到无穷大,只返回结果的第二个元素:
Redis> ZRANGE myzset (1 +inf BYSCORE LIMIT 1 1
1)“三个”
Redis>