ZRANGEBYSCORE
返回分数范围内有序集合中的成员。
语法
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
引入版本:1.0.5
复杂度摘要:O(log(N)
返回 key 处有序集合中分数在 min 和 max 之间的所有元素(包括分数等于 min 或 max 的元素)。这些元素被认为是从低分到高分排序的。
具有相同分数的元素按字典顺序返回(这源于Redis中有序集合实现的属性,并且不涉及进一步的计算)。
可选的 LIMIT 参数可用于仅获取匹配元素的范围(类似于 SQL 中的 选择 LIMIT 偏移、计数)。负 count 返回 offset 中的所有元素。请记住,如果 offset 很大,则需要先遍历有序集合以查找 offset 元素,然后才能找到要返回的元素,这可能会增加 O(N) 时间复杂度。
可选的 WITHSCORES 参数使命令返回元素及其分数,而不是单独返回元素。此选项自 Redis 2.0 起可用。
必需参数
key
保存有序集合的键的名称。
min
最低分数。除非以 ( 为前缀,否则该界限是包含在内的。使用 -inf 没有下限。
max
最高分。除非以 ( 为前缀,否则该界限是包含在内的。使用 +inf 表示没有上限。
可选参数
WITHSCORES
同时返回每个成员的分数。
LIMIT offset count
跳过 offset 个匹配成员并返回最多 count 个成员。负 count 返回所有剩余成员。
示例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANGEBYSCORE myzset -inf +inf
1) "one"
2) "two"
3) "three"
redis> ZRANGEBYSCORE myzset 1 2
1) "one"
2) "two"
redis> ZRANGEBYSCORE myzset (1 2
1) "two"
redis> ZRANGEBYSCORE myzset (1 (2
(empty array)
详细说明
互斥区间和无穷大
min 和 max 可以是 -inf 和 +inf,这样您就不需要知道有序集合中的最高或最低分数来获取某个分数或达到某个分数的所有元素。
默认情况下,min 和 max 指定的时间间隔是封闭的(含)。可以通过在分数前添加字符 ( 来指定开区间(不包括)。例如:
ZRANGEBYSCORE zset (1 5
将返回所有带有 1 < score <= 5 的元素,同时:
ZRANGEBYSCORE zset (5 (10
将返回所有带有 5 < score < 10 的元素(不包括 5 和 10)。
模式:元素的加权随机选择
通常,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
Redis Software 与 Redis Cloud 兼容性
| Redis 软件 |
Redis Cloud |
说明 |
|---|---|---|
| ✅ 标准 |
✅ 标准 |
从 Redis v6.2.0 开始已弃用。 |
返回值
RESP2
- 数组回复:成员列表,可选地,他们的分数在指定的分数范围内。
RESP3
- 数组回复:成员列表,可选地,他们的分数在指定的分数范围内。
资料来源:Redis 官方 ZRANGEBYSCORE 文档;中文内容参考 Redis 文档许可。