*Redis SRANDMEMBER 命令 随机获取集合中的一个或多个成员
*语法
SRANDMEMBER key [count]
*说明
从存储在 key 的 Set 集合中随机返回指定数量的成员,但不移除它们。
SRANDMEMBER 与 SPOP 的区别在于:SRANDMEMBER 只是"查看"(peek),不会修改集合内容;而 SPOP 会真正从集合中移除成员。
如果未指定 count,则默认返回 1 个 随机成员。
如果指定了 count:
- 当
count为正数时,返回count个不重复的随机成员(unique random members)。如果count大于集合基数,则返回整个集合的所有成员。 - 当
count为负数时,返回|count|个成员,允许重复(duplicate members)。同一个成员可能多次出现在返回结果中。这在需要"有放回抽样"的场景中很有用。
重要提示:
- SRANDMEMBER 返回的成员是随机的(random),不保证顺序。
- 当不指定 count 时,返回的是字符串(scalar)或 nil;指定 count 时返回的是数组(array)。
*返回值
- Bulk String — 不指定
count时:随机返回的单个成员。如果集合为空或key不存在,返回nil。 - Array — 指定
count时:随机成员列表。如果集合为空或key不存在,返回空数组。
*时间复杂度
- O(N),其中
N是返回的成员数量。对于正数count,底层需要随机选择N个不重复的成员。
*版本兼容性
| Redis 版本 | 变更说明 |
|---|---|
| >= 1.0.0 | 初始支持,仅单成员 |
| >= 2.6.0 | 支持可选的 count 参数 |
*示例
*示例 1:返回单个随机成员
SADD myset "a" "b" "c" "d" "e"
# 返回:(integer) 5
# 随机返回一个成员(不移除)
SRANDMEMBER myset
# 返回:"c"(随机)
# 集合大小不变
SCARD myset
# 返回:(integer) 5
*示例 2:返回多个不重复的随机成员
SADD colors "red" "green" "blue" "yellow" "purple"
# 返回:(integer) 5
# 返回 3 个不重复的随机颜色
SRANDMEMBER colors 3
# 返回:3 个随机颜色(顺序随机,不重复)
# 集合不变
SCARD colors
# 返回:(integer) 5
*示例 3:负数 count(允许重复)
SADD dice_faces "1" "2" "3" "4" "5" "6"
# 返回:(integer) 6
# 模拟掷骰子 5 次(有放回抽样)
SRANDMEMBER dice_faces -5
# 返回:5 个随机数字,可能有重复,如:
# 1) "3" 2) "6" 3) "3" 4) "1" 5) "6"
*示例 4:随机推荐场景
# 商品池
SADD products "p101" "p102" "p103" "p104" "p105" "p106" "p107" "p108"
# 返回:(integer) 8
# 为用户随机推荐 3 个商品(不重复)
SRANDMEMBER products 3
# 返回:3 个随机商品 ID(顺序随机,不重复)
# 商品池不受影响
SCARD products
# 返回:(integer) 8