# 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,或者nilkey不存在时。

数组回复:当附加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参数。

# 反馈

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

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