ZRANGEBYSCORE (已弃用)
自 Redis 6.2.0 版本起,此命令被视为已弃用。
在迁移或编写新代码时,可以用带有BYSCORE参数的ZRANGE来替换它。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- Available since:
- 1.0.5
- Time complexity:
- O(log(N)+M) with N being the number of elements in the sorted set and M the number of elements being returned. If M is constant (e.g. always asking for the first 10 elements with LIMIT), you can consider it O(log(N)).
- ACL categories:
-
@read,@sortedset,@slow,
返回在key中所有分数在min和max之间的有序集合中的元素(包括分数等于min或max的元素)。这些元素被认为是按分数从低到高排序的。
具有相同分数的元素按字典顺序返回(这源于Redis中排序集实现的一个属性,不涉及进一步的计算)。
可选的 LIMIT 参数可用于仅获取匹配元素的范围(类似于 SQL 中的 SELECT LIMIT offset, count)。负数的 count 会返回从 offset 开始的所有元素。
请记住,如果 offset 很大,排序集需要遍历 offset 个元素才能到达要返回的元素,这可能会增加 O(N) 的时间复杂度。
可选的 WITHSCORES 参数使命令返回元素及其分数,而不仅仅是元素本身。
此选项自 Redis 2.0 起可用。
独占区间和无穷大
min 和 max 可以是 -inf 和 +inf,因此您不需要知道排序集合中的最高或最低分数来获取从某个分数开始或到某个分数的所有元素。
默认情况下,由min和max指定的区间是闭区间(包含端点)。
可以通过在分数前加上字符(来指定开区间(不包含端点)。
例如:
ZRANGEBYSCORE zset (1 5
将返回所有满足 1 < score <= 5 的元素,当:
ZRANGEBYSCORE zset (5 (10
将返回所有5 < score < 10(不包括5和10)的元素。
示例
模式:元素的加权随机选择
通常ZRANGEBYSCORE仅用于获取分数为索引整数键的项目范围,然而使用该命令可以实现不太明显的功能。
例如,在实现马尔可夫链和其他算法时,一个常见的问题是从集合中随机选择一个元素,但不同的元素可能具有不同的权重,这些权重会影响它们被选中的可能性。
这是我们如何使用此命令来挂载这样的算法:
假设你有元素A、B和C,它们的权重分别为1、2和3。 你计算权重的总和,即1+2+3 = 6
此时,您可以使用此算法将所有元素添加到排序集合中:
SUM = ELEMENTS.TOTAL_WEIGHT // 6 in this case.
SCORE = 0
FOREACH ELE in ELEMENTS
SCORE += ELE.weight / SUM
ZADD KEY SCORE ELE
END
这意味着你设置了:
A to score 0.16
B to score .5
C to score 1
由于这涉及到近似值,为了避免C被设置为0.998而不是1,我们只需修改上述算法以确保最后一个分数为1(留给读者作为练习...)。
此时,每次你想获取一个加权随机元素时,
只需计算一个0到1之间的随机数(这就像在大多数语言中调用
rand()),所以你可以这样做:
RANDOM_ELE = ZRANGEBYSCORE key RAND() +inf LIMIT 0 1
RESP2/RESP3 回复
- Array reply: 一个包含成员列表的数组,可选地包含它们在指定分数范围内的分数。
历史
- 从 Redis 2.0.0 版本开始:添加了
WITHSCORES修饰符。