SRANDMEMBER

语法
SRANDMEMBER key [count]
可用版本
Redis 开源版 1.0.0
时间复杂度
不带 count 参数时为 O(1),否则为 O(N),其中 N 是传入 count 的绝对值。
ACL 类别
@read, @set, @slow,

仅使用 key 参数调用时,从存储在 key 的集合值中返回一个随机元素。

如果提供的 count 参数为正,返回一个由不同元素组成的数组。数组的长度是 count 或集合的基数 (SCARD) 中的较小者。

如果使用负的 count 调用,行为会改变,命令被允许多次返回同一元素。在这种情况下,返回元素的数量是指定 count 的绝对值。

示例

SADD myset one two three SRANDMEMBER myset SRANDMEMBER myset 2 SRANDMEMBER myset -5

传递 count 参数时的行为说明

count 参数为正值时,此命令行为如下

  • 不返回重复元素。
  • 如果 count 大于集合的基数,命令将只返回整个集合,不包含额外元素。
  • 回复中元素的顺序并非真正随机,因此如果需要打乱顺序,则由客户端负责。

count 为负值时,行为变化如下

  • 可能返回重复元素。
  • 总是返回恰好 count 个元素,如果集合为空(键不存在),则返回一个空数组。
  • 回复中元素的顺序是真正随机的。

返回元素的分布

注意:本节仅与 Redis 5 或更早版本相关,因为 Redis 6 实现了更公平的算法。

当集合中的元素数量较少时,返回元素的分布远非完美,这是因为我们使用了一个近似的随机元素函数,该函数不能真正保证良好的分布。

所使用的算法(在 dict.c 中实现)会对哈希表桶进行采样以查找非空桶。一旦找到非空桶,由于我们在哈希表实现中使用了链式结构,会检查桶内的元素数量并选择一个随机元素。

这意味着如果在整个哈希表中只有两个非空桶,其中一个有三个元素而另一个只有一个,那么单独位于其桶中的元素将以更高的概率被返回。

RESP2 回复

以下之一

  • 批量字符串回复:不带额外的 count 参数时,命令返回一个随机选取的成员,或者在 key 不存在时返回 Nil 回复
  • 数组回复:传递可选的 count 参数时,命令返回一个成员数组,或者在 key 不存在时返回一个空数组。

RESP3 回复

以下之一

  • 批量字符串回复:不带额外的 count 参数时,命令返回一个随机选取的成员,或者在 key 不存在时返回 Null 回复
  • 数组回复:传递可选的 count 参数时,命令返回一个成员数组,或者在 key 不存在时返回一个空数组。

历史

  • 从 Redis 2.6.0 版本开始:添加了可选的 count 参数。
评价此页面
回到顶部 ↑