ZRANGEBYLEX、ZREVRANGEBYLEX:返回指定字典序范围内的成员

正如本章开头所说,对于拥有不同分值的有序集合成员来说,成员的大小将由分值决定,至于分值相同的成员,它们的大小则由该成员在字典序中的大小决定。

这种排列规则的一个特例是,当有序集合的所有成员都拥有相同的分值时,有序集合的成员将不再根据分值进行排序,而是根据字典序进行排序。在这种情况下,本章前面介绍的根据分值对成员进行操作的命令,比如 ZRANGEBYSCORE、ZCOUNT 和 ZREMRANGEBYSCORE 等,都将不再适用。

为了让用户可以对字典序排列的有序集合执行类似 ZRANGEBYSCORE 这样的操作,Redis 提供了相应的 ZRANGEBYLEX、ZREVRANGEBYLEX、ZLEXCOUNT 和 ZREMRANGEBYLEX 命令,这些命令可以分别对字典序排列的有序集合执行升序排列的范围获取操作、降序排列的范围获取操作、统计位于字典序指定范围内的成员数量以及移除位于字典序指定范围内的成员,本章接下来将分别对这些命令进行介绍。

首先,让我们来学习一下 ZRANGEBYLEX 命令,这个命令可以从字典序排列的有序集合中获取位于字典序指定范围内的成员:

ZRANGEBYLEX sorted_set min max

命令的 min 参数和 max 参数用于指定用户想要获取的字典序范围,它们的值可以是以下 4 种值之一:

  • 带有[符号的值表示在结果中包含与给定值具有同等字典序大小的成员。

  • 带有(符号的值表示在结果中不包含与给定值具有同等字典序大小的成员。

  • 加号 + 表示无穷大。

  • 减号 - 表示无穷小。

举个例子,对于图6-36 所示的 words 有序集合来说,如果我们想要通过 ZRANGEBYLEX 命令获取 words 有序集合包含的所有成员,那么只需要将 min 参数的值设置为 -,max 参数的值设置为 + 即可:

redis> ZRANGEBYLEX words - +
1) "address"
2) "after"
3) "apple"
4) "bamboo"
5) "banana"
6) "bear"
7) "book"
8) "candy"
9) "cat"
10) "client"
image 2025 01 03 20 41 53 592
Figure 1. 图6-36 words有序集合

如果我们想要获取 words 有序集合中所有以字母 "a" 开头的成员,那么只需要将 min 参数的值设置为 [a,max 参数的值设置为(b 即可:

redis> ZRANGEBYLEX words [a (b
1) "address"
2) "after"
3) "apple"

如果我们想要获取 words 有序集合中所有字典序小于字母 "c" 的成员,那么只需要将 min 参数的值设置为 -,max 参数的值设置为(c 即可:

redis> ZRANGEBYLEX words - (c
1) "address"
2) "after"
3) "apple"
4) "bamboo"
5) "banana"
6) "bear"
7) "book"

ZREVRANGEBYLEX

ZREVRANGEBYLEX 命令是逆序版的 ZRANGEBYLEX 命令,它会以逆字典序的方式返回指定范围内的成员:

ZREVRANGEBYLEX sorted_set max min

需要注意的是,与 ZRANGEBYLEX 命令先接受 min 参数后接受 max 参数的做法正好相反,ZREVRANGEBYLEX 命令是先接受 max 参数,然后再接受 min 参数的。除此之外,这两个命令的 min 参数和 max 参数能够接受的值是完全相同的。

作为例子,以下代码展示了如何以逆字典序的方式返回有序集合中所有以字母 "a" 和字母 "b" 开头的成员:

redis> ZREVRANGEBYLEX words (c [a
1) "book"
2) "bear"
3) "banana"
4) "bamboo"
5) "apple"
6) "after"
7) "address"

限制命令返回的成员数量

与有序集合的其他范围型获取命令一样,ZRANGEBYLEX 和 ZREVRANGEBYLEX 也可以通过可选的 LIMIT 选项来限制命令返回的成员数量

ZRANGEBYLEX sorted_set min max [LIMIT offset count]
ZREVRANGEBYLEX sorted_set max min [LIMIT offset count]

作为例子,以下代码展示了如何以逆字典序的方式返回有序集合中第一个以字母 "b" 开头的成员:

redis> ZRANGEBYLEX words [b + LIMIT 0 1
1) "bamboo"

其它信息

  • 复杂度:ZRANGEBYLEX 命令和 ZREVRANGEBYLEX 命令的复杂度都为 O(log(N)+M),其中 N 为有序集合包含的元素数量,而 M 则为命令返回的成员数量。

  • 版本要求:ZRANGEBYLEX 命令和 ZREVRANGEBYLEX 命令从 Redis 2.8.9 版本开始可用。