# 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之间的所有元素(包括得分等于minmax的元素)。元素被认为是从低到高的顺序排列。

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

可选的LIMIT参数只能用于获取匹配元素的范围(类似于SQL中的SELECT LIMIToffset计数)。负数count返回offset中的所有元素。请记住,如果offset很大,则在到达要返回的元素之前,需要遍历已排序的集合中的offset元素,这可能会增加O(N)的时间复杂性。

可选的WITHSCORES参数使命令返回元素及其分数,而不是仅返回元素。此选项从Redis 2.0开始提供。

# 排他区间和无穷大

minmax可以是-inf+inf,这样你就不需要知道排序集中的最高或最低分数,就可以从某个分数中获得所有元素。

默认情况下,由minmax指定的间隔是关闭的(包括在内)。可以通过在分数前面加上字符(来指定开放间隔(排他)。例如:

ZRANGEBYSCORE zset (1 5

1 < score <= 5将返回所有带有while的元素:

ZRANGEBYSCORE zset (5 (10

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

# 返回

数组回复:指定分数范围内的元素列表(可选地与他们的分数)。

# 例子

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)
redis> 

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

通常,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 版本 2.0.0 开始:添加了WITHSCORES修饰符。

# 反馈

如果您在此页面上发现问题,或有改进建议,请提交请求以合并或打开存储库中的问题。

Last Updated: 4/18/2023, 8:45:33 AM