- 用法
-
ZRANGEBYLEX key min max [ LIMIT offset count ]
- 复杂度
- O(log(N)+M),其中 N 为有序集合中的元素数量,M 为返回的元素数量。如果 M 是常量(例如,总是使用 LIMIT 请求前 10 个元素),则可以认为是 O(log(N))。
- 起始版本
- 2.8.9
- ACL 类别
- @sortedset, @read, @slow
当有序集合中的所有元素都以相同的分数插入,为了强制按字典序排序时,此命令返回 `key` 处有序集合中介于 `min` 和 `max` 之间的所有元素。
如果有序集合中的元素具有不同的分数,则返回的元素是未指定的。
元素被认为是按照使用 `memcmp()` C 函数逐字节比较的从小到大的字符串排序。如果共同部分相同,则较长的字符串被认为大于较短的字符串。
可选的 `LIMIT` 参数可用于仅获取匹配元素的一个范围(类似于 SQL 中的 *SELECT LIMIT offset, count*)。负数的 `count` 返回从 `offset` 开始的所有元素。请记住,如果 `offset` 很大,有序集合需要遍历 `offset` 个元素才能到达要返回的元素,这可能导致 O(N) 的时间复杂度。
如何指定区间
有效的 *start* 和 *stop* 必须以 `(` 或 `[` 开头,分别表示范围项是排他的还是包含的。*start* 和 *stop* 的特殊值 `+` 或 `-` 具有正无穷和负无穷字符串的特殊含义,因此,例如,命令 **ZRANGEBYLEX myzset - +** 在所有元素具有相同分数的情况下,保证返回有序集合中的所有元素。
字符串比较的详细信息
字符串以二进制字节数组的形式进行比较。由于 ASCII 字符集的指定方式,这意味着通常也会以显而易见的字典方式比较普通 ASCII 字符。但是,如果使用非纯 ASCII 字符串(例如 utf8 字符串),则不适用。
但是,用户可以对编码后的字符串应用转换,使得插入到有序集合中的元素的第一部分能够按照用户对特定应用程序的要求进行比较。例如,如果我想添加以不区分大小写的方式进行比较的字符串,但在查询时仍想检索实际大小写,我可以通过以下方式添加字符串
ZADD autocomplete 0 foo:Foo 0 bar:BAR 0 zap:zap
由于每个元素中(冒号字符之前)的第一个 *标准化* 部分,我们强制进行给定的比较;但是,在使用 `ZRANGEBYLEX` 查询范围后,应用程序可以向用户显示字符串中冒号之后的第二部分。
比较的二进制性质允许将有序集合用作通用索引,例如,元素的第一部分可以是 64 位大端数字:由于大端数字将最高有效字节放在初始位置,因此二进制比较将与数字的数值比较匹配。这可用于在 64 位值上实现范围查询。如下面的示例所示,在前 8 个字节之后,我们可以存储我们实际索引的元素的值。
示例
127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 7
127.0.0.1:6379> ZRANGEBYLEX myzset - [c
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> ZRANGEBYLEX myzset - (c
1) "a"
2) "b"
127.0.0.1:6379> ZRANGEBYLEX myzset [aaa (g
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"
RESP2/RESP3 回复
数组回复:指定分数范围内的元素列表。