ZRANGEBYSCORE、ZREVRANGEBYSCORE:获取指定分值范围内的成员
通过使用 ZRANGEBYSCORE 命令或者 ZREVRANGEBYSCORE 命令,用户可以以升序排列或者降序排列的方式获取有序集合中分值介于指定范围内的成员:
ZRANGEBYSCORE sorted_set min max
ZREVRANGEBYSCORE sorted_set max min
命令的 min 参数和 max 参数分别用于指定用户想要获取的成员的最小分值和最大分值。
不过需要注意的是,ZRANGEBYSCORE 命令和 ZREVRANGEBYSCORE 命令接受 min 参数和 max 参数的顺序正好相反:ZRANGEBYSCORE 命令先接受 min 参数然后再接受 max 参数,而 ZREVRANGEBYSCORE 命令则是先接受 max 参数然后再接受 min 参数。
作为例子,以下代码展示了如何通过 ZRANGEBYSCORE 命令,以升序排列方式从 salary 有序集合中获取分值介于 3800~5000 的成员:
redis> ZRANGEBYSCORE salary 3800 5000
1) "bob"
2) "jack"
3) "tom"
图6-19 展示了这个 ZRANGEBYSCORE 命令的执行过程。
与此类似,以下代码展示了如何通过 ZREVRANGEBYSCORE 命令,以降序排列方式从 salary 有序集合中获取分值介于 5000~3000 的成员:
redis> ZREVRANGEBYSCORE salary 5000 3000
1) "tom"
2) "jack"
3) "bob"
4) "peter"

图6-20 展示了这个 ZREVRANGEBYSCORE 命令的执行过程。

获取成员及其分值
与 ZRANGE 命令和 ZREVRANGE 命令类似,ZRANGEBYSCORE 命令和 ZREVRANGEBYSCORE 命令也可以通过在执行时给定可选的 WITHSCORES 选项来同时获取成员及其分值:
ZRANGEBYSCORE sorted_set min max [WITHSCORES]
ZREVRANGEBYSCORE sorted_set max min [WITHSCORES]
以下代码展示了两个使用 WITHSCORES 选项的例子:
redis> ZRANGEBYSCORE salary 3800 5000 WITHSCORES
1) "bob"
2) "3800" -- 成员"bob"的分值
3) "jack"
4) "4500" -- 成员"jack"的分值
5) "tom"
6) "5000" -- 成员"tom"的分值
redis> ZREVRANGEBYSCORE salary 5000 3000 WITHSCORES
1) "tom"
2) "5000" -- 成员"tom"的分值
3) "jack"
4) "4500" -- 成员"jack"的分值
5) "bob"
6) "3800" -- 成员"bob"的分值
7) "peter"
8) "3500" -- 成员"peter"的分值
限制命令返回的成员数量
在默认情况下,ZRANGEBYSCORE 命令和 ZREVRANGEBYSCORE 命令会直接返回给定分值范围内的所有成员,但如果范围内的成员数量较多,或者我们只需要范围内的其中一部分成员,那么可以使用可选的 LIMIT 选项来限制命令返回的成员数量:
ZRANGEBYSCORE sorted_set min max [LIMIT offset count]
ZREVRANGEBYSCORE sorted_set max min [LIMIT offset count]
LIMIT 选项接受 offset 和 count 两个参数作为输入,其中 offset 参数用于指定命令在返回结果之前需要跳过的成员数量,而 count 参数则用于指示命令最多可以返回多少个成员。
举个例子,假设我们想要以升序排列方式获取 salary 有序集合中分值介于 3000~5000 的第一个成员,那么可以执行以下命令:
redis> ZRANGEBYSCORE salary 3000 5000 LIMIT 0 1
1) "peter"
在这个命令中,offset 参数的值为 0,表示命令不需要跳过任何成员;而 count 参数的值为 1,表示命令只需要返回一个成员即可。
如果我们想要以升序排列方式,获取 salary 有序集合中分值介于 3000~5000 的第二个和第三个成员,那么可以执行以下命令:
redis> ZRANGEBYSCORE salary 3000 5000 LIMIT 1 2
1) "bob"
2) "jack"
在这个命令中,offset 参数的值为 1,表示命令需要跳过指定分值范围内的第一个成员,count 参数的值为 2,表示命令需要在跳过第一个成员之后,获取接下来的两个成员,而这两个成员就是位于指定分值范围内的第二个和第三个成员。
使用开区间分值范围
在默认情况下,ZRANGEBYSCORE 命令和 ZREVRANGEBYSCORE 命令接受的分值范围都是闭区间分值范围,也就是说,分值等于用户给定最大分值或者最小分值的成员也会被包含在结果当中。
举个例子,如果我们执行命令:
redis> ZRANGEBYSCORE salary 3500 5000 WITHSCORES
1) "peter"
2) "3500"
3) "bob"
4) "3800"
5) "jack"
6) "4500"
7) "tom"
8) "5000"
那么分值等于 3500 或者 5000 的成员也会被包含在结果当中。
如果用户想要定义的是开区间而不是闭区间,那么可以在给定分值范围时,在分值参数的前面加上一个单括号“(”,这样,具有给定分值的成员就不会出现在命令返回的结果当中。
举个例子,以下命令只会返回分值大于 3500 且小于 5000 的成员,但并不会返回分值等于 3500 或者等于 5000 的成员:
redis> ZRANGEBYSCORE salary (3500 (5000 WITHSCORES
1) "bob"
2) "3800"
3) "jack"
4) "4500"
以下命令只会返回分值大于等于 3500 且小于 5000 的成员,但并不会返回分值等于 5000 的成员:
redis> ZRANGEBYSCORE salary 3500 (5000 WITHSCORES
1) "peter"
2) "3500"
3) "bob"
4) "3800"
5) "jack"
6) "4500"
以下命令只会返回分值大于 3500 且小于等于 5000 的成员,但并不会返回分值等于 3500 的成员:
redis> ZRANGEBYSCORE salary (3500 5000 WITHSCORES
1) "bob"
2) "3800"
3) "jack"
4) "4500"
5) "tom"
6) "5000"
使用无限值作为范围
ZRANGEBYSCORE 命令和 ZREVRANGEBYSCORE 命令的 min 参数和 max 参数除了可以是普通的分值或者带有(符号的分值之外,还可以是特殊值 +inf 或者 -inf,前者用于表示无穷大,而后者则用于表示无穷小:当我们只想定义分值范围的上限或者下限,而不是同时定义分值范围的上限和下限时,+inf 和 -inf 就可以派上用场。
比如,如果我们想要获取 salary 有序集合中所有分值小于 5000 的成员,那么可以执行以下命令:
redis> ZRANGEBYSCORE salary -inf (5000 WITHSCORES
1) "peter"
2) "3500"
3) "bob"
4) "3800"
5) "jack"
6) "4500"
这个命令调用只定义了分值范围的上限,而没有定义分值范围的下限,因此命令将返回有序集合中所有分值低于给定上限的成员。
如果我们想要获取 salary 有序集合中所有分值大于 4000 的成员,那么可以执行以下命令:
redis> ZRANGEBYSCORE salary (4000 +inf WITHSCORES
1) "jack"
2) "4500"
3) "tom"
4) "5000"
5) "mary"
6) "5500"
与之前的例子正好相反,这次的命令调用只定义了分值范围的下限,但是没有定义分值范围的上线,因此命令将返回有序集合中所有分值高于给定下限的成员。