*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| 个(可重复)。