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且分数介于minmax(包括 score 等于minmax). 元素被视为按从低分到高分的顺序排列。

具有相同分数的元素按字典顺序返回(此 遵循 Redis 中排序集实现的属性,并且不会 涉及进一步的计算)。

可选的LIMIT参数只能用于获取匹配的 元素(类似于 SQL 中的 SELECT LIMIT offset、count)。否定的count返回offset. 请记住,如果offset较大,则需要遍历offset元素,这加起来可以是 O(N) 时间复杂度。

可选的WITHSCORES参数使命令同时返回元素和 它的分数,而不仅仅是 element 的 Score。 此选项从 Redis 2.0 开始可用。

独占间隔和无穷大

minmax可以是-inf+inf,因此您无需了解情况 排序集中用于获取所有元素的最高或最低分数 一定的分数。

默认情况下,由minmax已关闭(含)。 可以通过在分数前加上前缀来指定开放间隔(不包括) 替换为字符 . 例如:(

ZRANGEBYSCORE zset (1 5

将返回所有元素1 < score <= 5而:

ZRANGEBYSCORE zset (5 (10

将返回所有元素5 < score < 10(不包括 5 和 10)。

例子

redis> ZADD myzset 1 “一”
Failed to fetch
redis> ZADD myzset 2 “二”
Failed to fetch
redis> ZADD myzset 3 “三”
Failed to fetch
redis> ZRANGEBYSCORE myzset -inf +inf
Failed to fetch
redis> ZRANGEBYSCORE MYZSET 1 2
Failed to fetch
redis> ZRANGEBYSCORE myzset (1 2
Failed to fetch
redis> ZRANGEBYSCORE myzset (1 (2
Failed to fetch
redis>

模式:元素的加权随机选择

通常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修饰语。
为本页评分
返回顶部 ↑