ZRANGEBYSCORE 已弃用

用法
ZRANGEBYSCORE key min max [ WITHSCORES ] [ LIMIT offset count ]
复杂度
O(log(N)+M),其中 N 是有序集合中的元素数量,M 是返回的元素数量。如果 M 是常量(例如,总是使用 LIMIT 请求前 10 个元素),则可以将其视为 O(log(N))。
自版本
1.0.5
ACL 类别
@sortedset, @read, @slow

返回有序集合 key 中分数在 minmax 之间(包括分数等于 minmax 的元素)的所有元素。这些元素被认为是按分数从低到高排序的。

具有相同分数的元素按字典顺序返回(这遵循 Valkey 有序集合实现的一个特性,不涉及额外的计算)。

可选的 LIMIT 参数可用于仅获取匹配元素的一个范围(类似于 SQL 中的 SELECT LIMIT offset, count)。负的 count 返回从 offset 开始的所有元素。请记住,如果 offset 很大,有序集合需要遍历 offset 个元素才能到达要返回的元素,这可能导致 O(N) 的时间复杂度。

可选的 WITHSCORES 参数使命令返回元素及其分数,而不是仅返回元素。

排他区间与无穷

minmax 可以是 -inf+inf,这样您就不需要知道有序集合中的最高或最低分数来获取从某个分数开始或到某个分数为止的所有元素。

默认情况下,由 minmax 指定的区间是闭合的(包含)。可以通过在分数前加上字符 ( 来指定开区间(排他)。例如

ZRANGEBYSCORE zset (1 5

将返回所有满足 1 < score <= 5 的元素,而

ZRANGEBYSCORE zset (5 (10

将返回所有满足 5 < score < 10 的元素(5 和 10 排除)。

示例

127.0.0.1:6379> ZADD myzset 1 "one"
(integer) 1
127.0.0.1:6379> ZADD myzset 2 "two"
(integer) 1
127.0.0.1:6379> ZADD myzset 3 "three"
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE myzset -inf +inf
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> ZRANGEBYSCORE myzset 1 2
1) "one"
2) "two"
127.0.0.1:6379> ZRANGEBYSCORE myzset (1 2
1) "two"
127.0.0.1:6379> ZRANGEBYSCORE myzset (1 (2
(empty array)

模式:加权随机选择一个元素

通常 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 回复

  • 数组回复:成员列表,可选择性地包含指定分数范围内的分数。

历史

版本 更改
2.0.0

添加了 WITHSCORES 修饰符。