*Redis SRANDMEMBER 命令 随机获取集合中的一个或多个成员

*语法

SRANDMEMBER key [count]

*说明

从存储在 keySet 集合中随机返回指定数量的成员,但不移除它们。

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

*相关命令

  • SPOP — 随机移除并返回成员
  • SMEMBERS — 返回集合中的所有成员