*Redis ZRANDMEMBER 命令

ZRANDMEMBER 从有序集合中随机返回指定数量的成员,可选择是否返回分数。


*语法

ZRANDMEMBER key [count [WITHSCORES]]

*参数说明

参数 类型 必填 说明
key String 有序集合键名
count Integer 返回数量。正数不重复,负数允许重复,默认 1
WITHSCORES Flag 同时返回分数

*返回值

  • String(count 省略时):单个随机成员
  • Array(count 提供时):成员数组,或 [member, score, ...](带 WITHSCORES)
  • Nil:key 不存在

*时间复杂度

  • count 未提供:O(1) - count 提供且绝对值小于集合基数:O(count) - count 提供且绝对值大于集合基数:O(N),N 为集合基数

*示例

*随机返回单个成员

> ZADD myzset 1 "a" 2 "b" 3 "c" 4 "d"
(integer) 4
> ZRANDMEMBER myzset
"b"
> ZRANDMEMBER myzset
"d"

*返回多个不重复成员

> ZRANDMEMBER myzset 2
1) "c"
2) "a"

*返回带分数的随机成员

> ZRANDMEMBER myzset 2 WITHSCORES
1) "b"
2) "2"
3) "d"
4) "4"

*允许重复的随机采样

> ZRANDMEMBER myzset -3
1) "a"
2) "b"
3) "b"

*常见错误

错误 原因 解决
WRONGTYPE key 不是有序集合 检查 key 类型
ERR value is not an integer count 非整数 count 必须为整数

*最佳实践

  • 场景:随机抽奖、A/B 测试分组、样本抽查、推荐系统随机候选
  • count 为正:不重复随机采样(适合抽奖不重复中奖)
  • count 为负:可重复采样(适合有放回的随机抽取)
  • 注意:随机性基于均匀分布,不保证分数分布均匀
  • 大集合随机采样时,小 count 性能良好;count 接近 N 时性能下降

*FAQ

Q1: ZRANDMEMBER 的随机是均匀分布吗? A: 是,每个成员被选中的概率相等,与分数无关。

Q2: 集合为空或不存在会怎样? A: 返回 nil(count 省略)或空数组(count 提供)。

Q3: count 大于集合大小会怎样? A: 正数 count 返回整个集合(不重复);负数 count 返回 |count| 个(可重复)。