SRANDMEMBER

从一组中随机获取一个或多个成员

语法

SRANDMEMBER key [count]

引入版本:1.0.0

复杂度摘要:O(1)

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

如果提供的 count 参数为正,则返回 独特的元素 数组。数组的长度是 count 或集合的基数 (SCARD),以较小者为准。

如果使用负 count 进行调用,则行为会发生变化,并且允许命令返回 多次使用相同元素。在这种情况下,返回的元素数量是指定count的绝对值。

必需参数

key

保存该集合的键的名称。

可选参数

count

返回的会员数量。正的 count 返回最多多个不同的成员;负 count 会准确返回 |count| 成员,并且可能会重复它们。

示例

redis> SADD myset one two three
(integer) 3
redis> SRANDMEMBER myset
redis> SRANDMEMBER myset 2
redis> SRANDMEMBER myset -5

详细说明

计数通过时的行为规范

当 count 参数为正值时,该命令的行为如下:

  • 不返回重复元素。
  • 如果 count 大于集合的基数,则该命令将仅返回整个集合,而不返回其他元素。
  • 回复中元素的顺序并不是真正随机的,因此客户端可以根据需要对它们进行打乱顺序。

当 count 为负值时,行为发生如下变化:

  • 重复元素是可能的。
  • 始终返回 count 元素,或者如果集合为空(不存在的键)则返回空数组。
  • 回复中元素的顺序确实是随机的。

返回元素分布

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

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

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

这意味着,如果整个哈希表中有两个非空桶,其中一个有 3 个元素,而一个只有 1 个元素,则返回该桶中唯一的元素的概率要高得多。

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
✅ 标准
✅ 主动-主动
✅ 标准
✅ 主动-主动

返回值

RESP2

以下之一: * 批量字符串回复:如果没有附加的 计数 参数,该命令将返回随机选择的成员,或者当 关键 不存在时返回 无回复。 * 数组回复:当传递可选的 计数 参数时,该命令返回一个成员数组,或者当 关键 不存在时返回一个空数组。

RESP3

以下之一: * 批量字符串回复:如果没有附加的 计数 参数,该命令将返回随机选择的成员,或者当 关键 不存在时返回 空回复。 * 数组回复:当传递可选的 计数 参数时,该命令返回一个成员数组,或者当 关键 不存在时返回一个空数组。

资料来源:Redis 官方 SRANDMEMBER 文档;中文内容参考 Redis 文档许可。