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
的绝对值。
示例
传递 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
参数。