- 用法
-
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
中分数在 min
和 max
之间(包括分数等于 min
或 max
的元素)的所有元素。这些元素被认为是按分数从低到高排序的。
具有相同分数的元素按字典顺序返回(这遵循 Valkey 有序集合实现的一个特性,不涉及额外的计算)。
可选的 LIMIT
参数可用于仅获取匹配元素的一个范围(类似于 SQL 中的 SELECT LIMIT offset, count)。负的 count
返回从 offset
开始的所有元素。请记住,如果 offset
很大,有序集合需要遍历 offset
个元素才能到达要返回的元素,这可能导致 O(N) 的时间复杂度。
可选的 WITHSCORES
参数使命令返回元素及其分数,而不是仅返回元素。
排他区间与无穷
min
和 max
可以是 -inf
和 +inf
,这样您就不需要知道有序集合中的最高或最低分数来获取从某个分数开始或到某个分数为止的所有元素。
默认情况下,由 min
和 max
指定的区间是闭合的(包含)。可以通过在分数前加上字符 (
来指定开区间(排他)。例如
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 | 添加了 |