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
(包括 score 等于min
或max
).
元素被视为按从低分到高分的顺序排列。
具有相同分数的元素按字典顺序返回(此 遵循 Redis 中排序集实现的属性,并且不会 涉及进一步的计算)。
可选的LIMIT
参数只能用于获取匹配的
元素(类似于 SQL 中的 SELECT LIMIT offset、count)。否定的count
返回offset
.
请记住,如果offset
较大,则需要遍历offset
元素,这加起来可以是
O(N) 时间复杂度。
可选的WITHSCORES
参数使命令同时返回元素和
它的分数,而不仅仅是 element 的 Score。
此选项从 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
仅用于获取项目范围
其中 score 是索引整数键,但是可以执行更少的作
显而易见的事情。
例如,实现马尔可夫链和其他算法时的常见问题。 是从集合中随机选择一个元素,但不同的元素可能具有 不同的权重会改变他们被挑选的可能性。
这就是我们使用此命令来挂载此类算法的方法:
假设您有权重为 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 回复
- Array reply:其分数在指定分数范围内的成员列表(可选)。
历史
- 从 Redis 版本 2.0.0 开始:添加了
WITHSCORES
修饰语。