# 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
中得分在min
和max
之间的所有元素(包括得分等于min
或max
的元素)。元素被认为是从低到高的顺序排列。
具有相同分数的元素按字典顺序返回(这遵循Redis中排序集实现的属性,不涉及进一步的计算)。
可选的LIMIT
参数只能用于获取匹配元素的范围(类似于SQL中的SELECT LIMIToffset
计数)。负数count
返回offset
中的所有元素。请记住,如果offset
很大,则在到达要返回的元素之前,需要遍历已排序的集合中的offset
元素,这可能会增加O(N)的时间复杂性。
可选的WITHSCORES
参数使命令返回元素及其分数,而不是仅返回元素。此选项从Redis 2.0开始提供。
# 排他区间和无穷大
min
和max
可以是-inf
和+inf
,这样你就不需要知道排序集中的最高或最低分数,就可以从某个分数中获得所有元素。
默认情况下,由min
和max
指定的间隔是关闭的(包括在内)。可以通过在分数前面加上字符(
来指定开放间隔(排他)。例如:
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
修饰符。
# 反馈
如果您在此页面上发现问题,或有改进建议,请提交请求以合并或打开存储库中的问题。
← Zincrby Zrangebylex →