随机读成员但不删除
SRANDMEMBER 从集合中随机返回一个或多个成员,并且保持集合内容不变:不传 count 返回单个成员,正数 count 返回不重复的成员,负数 count 允许重复且数量可以超过集合基数。它和 SPOP 的差别只有一个,但后果完全不同——SPOP 会把成员从集合里取走,SRANDMEMBER 只是看一眼。
基本信息
| 适用平台 | Redis 1.0+(带 count 参数需 2.6.0+) |
|---|---|
| 语法 | SRANDMEMBER key [count] |
| 返回值 | 成员、成员数组,或 nil(空集合) |
| 是否修改数据 | 不修改 |
| 对比命令 | SPOP 随机取出并删除成员 |
典型使用场景
- 随机推荐:从候选集合里挑几条内容展示,不改变池子
- 随机抽样巡检:从大数据集中抽若干条人工核对
- 随机问答与随机文案:每次展示不同组合
- 负载分散验证:确认请求是否真的随机落到不同数据上
- 配合集合判断的抽样:先随机取,再用 SISMEMBER 校验
示例与计数语义
示例与计数语义
SADD article:tags hot new deep
SRANDMEMBER article:tags # 随机返回 1 个成员
SRANDMEMBER article:tags 3 # 3 个不重复成员(不足时返回全部)
SRANDMEMBER article:tags -10 # 10 个允许重复的成员
SCARD article:tags # 3:集合未被修改
# 对比:SPOP 会把成员取走
SPOP article:tags 1 # 返回并删除 1 个成员
SCARD article:tags # 2:集合变小了count 语义与对比
| 用法 | 行为 | 典型场景 |
|---|---|---|
| 无 count | 随机返回单个成员或 nil | 取一条展示 |
| 正数 count | 去重,最多返回基数个 | 不重复的推荐位 |
| 负数 count | 允许重复,可超过基数 | 需要固定条数的展示 |
| SRANDMEMBER | 不修改集合 | 推荐、抽样、随机展示 |
| SPOP | 取出并删除成员 | 抽奖、发券、一次性名额 |
随机相关命令的共同前提是集合本身规模可控:集合元素极多时随机取样的成本仍然很低,但把成千上万条数据都塞进一个集合会在别处出问题,例如持久化与迁移。
正数 count 大于集合基数时返回全部成员而不报错:调用方若按固定条数处理,需要为样本不足的情况预留分支。