ZRANGEBYSCORE (已弃用)
自 Redis 6.2.0 版本起,此命令被视为已弃用。
在迁移或编写新代码时,可以使用带有 BYSCORE
参数的 ZRANGE
命令来替代它。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- 可用版本
- Redis Open Source 1.0.5
- 时间复杂度
- O(log(N)+M),其中 N 是有序集合中的元素数量,M 是返回的元素数量。如果 M 是常数(例如,总是使用 LIMIT 请求前 10 个元素),则可以将其视为 O(log(N))。
- ACL 类别
-
@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 回复
- 数组回复:在指定分数范围内的成员列表,可选地包含其分数。
历史
- 自 Redis 2.0.0 版本起:添加了
WITHSCORES
修饰符。