ZRANGEBYSCORE (已弃用)
从 Redis 6.2.0 版本开始,此命令被视为已弃用。
在迁移或编写新代码时,它可以用 ZRANGE
命令和 BYSCORE
参数替换。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- 可用时间
- 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
用于获取分数是索引整数键的项目的范围,但可以使用该命令执行不太明显的操作。
例如,在实现马尔可夫链和其他算法时,一个常见的问题是从集合中随机选择一个元素,但不同的元素可能有不同的权重,这会改变它们被选中的可能性。
以下是如何使用此命令来组装此类算法:
假设您有权重分别为 1、2 和 3 的元素 A、B 和 C。您计算权重的总和,即 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
修饰符。