Redis ZRANGEBYLEX 命令返回指定成员区间内的成员,按成员字符串的字典正序排序,且成员的分数必须相同。某些业务场景中,需要对一个字符串数组按名称的字典顺序进行排序时,可以使用 Redis 中 SortSet 这种数据结构来处理。每个成员的分数必须相同,如果有序集合中的成员分数有不一致的,返回的结果就不准。
我们知道 Redis 有序集合的分数底层数据结构采用跳跃表,所以分数相同时,便于基于跳跃表快速搜索成员字符串。
命令格式
ZRANGEBYLEX key min max [LIMIT offset count]
可用版本:>=2.8.9
时间复杂度:O(log(N)+M),N 为 有序集合的基数(成员个数),M 为指定的返回条数。
默认是以 ASCII 字符集的顺序进行排列。如果成员字符串包含 utf-8 这类字符集的内容,就会影响返回结果,所以建议不要使用。
源码中采用 C 语言中 memcmp()
函数,从字符的第0位到最后一位进行排序,如果前面部分相同,那么较长的字符串比较短的字符串排序靠后。
参数说明
min:字典中排序位置较小的成员,必须以 [
开头,或者以 (
开头,可使用 -
代替。
max:字典中排序位置较大的成员,必须以 [
开头,或者以 (
开头,可使用 +
代替。
LIMIT:返回结果是否分页,指令中包含 LIMIT 后 offset、count 必须输入。
offset:返回结果起始位置。
count:返回结果数量。
补充:
max
和min
参数前可以加(
符号作为开头表示小于,(
符号与成员之间不能有空格。返回成员结果集不会包含 max 和 min 成员。- 可以使用
-
和+
表示得分最小值和最大值。
命令返回值
返回指定成员范围的成员列表。
示例
redis> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 7
redis> ZRANGEBYLEX myzset - [c
1) "a"
2) "b"
3) "c"
redis> ZRANGEBYLEX myzset - (c
1) "a"
2) "b"
redis> ZRANGEBYLEX myzset [aaa (g
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"
redis>