# Srandmember
返回集合中一个或多个随机数
语法
SRANDMEMBER key [count]
可用版本:
1.0.0
时间复杂度:
没有计数参数 O(1),否则为 O(N),其中 N 是传递计数的绝对值。
ACL 类别:
@read
,@set
,@slow
当仅使用key
参数调用时,从存储在的集合值中返回一个随机元素key
。
如果count
提供的参数是正数,则返回一个不同元素count
的数组。数组的长度是count
或集合的基数 (SCARD
),以较低者为准。
如果使用否定调用,则行为会发生变化,并且允许该命令多次count
返回相同的元素。在这种情况下,返回元素的数量是指定的绝对值。
# 返回
Bulk string reply:没有附加count
参数,该命令返回一个带有随机选择元素的 Bulk Reply,或者nil
当key
不存在时。
数组回复:当附加count
参数被传递时,该命令返回一个元素数组,key
如果不存在则返回一个空数组。
# 例子
redis> SADD myset one two three
(integer) 3
redis> SRANDMEMBER myset
"two"
redis> SRANDMEMBER myset 2
1) "one"
2) "three"
redis> SRANDMEMBER myset -5
1) "one"
2) "two"
3) "three"
4) "one"
5) "two"
redis>
# 传递计数时的行为规范
当count
参数为正值时,此命令的行为如下:
- 不返回重复的元素。
- 如果
count
大于集合的基数,则该命令将仅返回整个集合而不返回其他元素。 - 回复中元素的顺序并不是真正随机的,所以如果需要,由客户端来打乱它们。
当count
为负值时,行为变化如下:
- 重复元素是可能的。
- 如果集合为空(不存在的键),则始终返回确切
count
的元素或空数组。 - 回复中元素的顺序是真正随机的。
# 返回元素的分布
注意:本节仅适用于 Redis 5 或更低版本,因为 Redis 6 实现了更公平的算法。
当集合中的元素数量很少时,返回元素的分布远非完美,这是因为我们使用了一个近似的随机元素函数,并不能真正保证良好的分布。
使用的算法在 dict.c 中实现,对哈希表桶进行采样以找到一个非空的桶。一旦找到一个非空桶,由于我们在哈希表实现中使用了链接,因此检查桶内元素的数量并选择一个随机元素。
这意味着如果你在整个哈希表中有两个非空的桶,一个有三个元素,一个只有一个,那么单独在它的桶中的元素将被返回的概率要高得多。
# 历史
- 从 Redis 版本 2.6.0 开始:添加了可选
count
参数。
# 反馈
如果您在此页面上发现问题,或有改进建议,请提交请求以合并或打开存储库中的问题。