从 Hash 里随机取字段
HRANDFIELD 随机返回 Hash 中的一个或多个字段:不传 count 时返回单个字段名,count 为正数时返回不重复的字段,为负数时允许重复,加上 WITHVALUES 可以连对应的值一起返回。它不修改数据,只做抽样,因此在抽奖、随机推荐、随机问答这类「取一条就展示」的场景里很顺手,需要注意它与集合类命令的适用对象不同。
基本信息
| 适用平台 | Redis 6.2.0+;WITHVALUES 选项同为 6.2.0+ |
|---|---|
| 语法 | HRANDFIELD key [count [WITHVALUES]] |
| 返回内容 | 字段名,或字段与值的交替列表 |
| 是否修改数据 | 不修改,纯抽样 |
| 空键行为 | 返回 nil 或空数组 |
典型使用场景
- 抽奖:从奖品池 Hash 中随机取一件未发放奖品
- 随机推荐:从候选池里取若干条展示位内容
- A/B 实验分流:从实验配置里随机挑一个分组
- 抽样检查:从大批量数据中随机抽取若干条人工核对
- 随机问答或随机文案:每次展示不同的内容组合
示例与返回形态
示例与返回形态
HRANDFIELD coupons # 随机一个字段名,空 Hash 返回 nil
HRANDFIELD coupons 3 # 3 个不重复字段(不足时返回全部)
HRANDFIELD coupons -5 # 5 个允许重复的字段
HRANDFIELD coupons 2 WITHVALUES # 字段与值成对返回(6.2+)
# 对比其他随机命令
SRANDMEMBER tags 3 # 从 Set 随机取成员,不删除
SPOP tags 1 # 从 Set 随机取并删除成员
ZRANDMEMBER ranking 3 # 从 ZSet 随机取成员(6.2+)count 语义与相关命令
| 用法 | 行为 | 适用 |
|---|---|---|
| 无 count | 返回单个字段名或 nil | 取一条展示 |
| 正数 count | 去重,最多返回字段总数个 | 抽样列表、不重复推荐 |
| 负数 count | 允许重复,数量可超过字段总数 | 需要固定条数的展示位 |
| WITHVALUES | 连值一起返回(6.2+) | 省一次 HGET 往返 |
| SRANDMEMBER / SPOP | 操作 Set 成员,后者会删除 | 抽奖需要「抽中即出局」用 SPOP |
HRANDFIELD 只做抽样不改数据,因此同一个字段可能被连续抽中:抽奖场景若要求「抽中即出局」,应改用 Set 的 SPOP 或在业务侧记录已中奖结果。
正数 count 超过字段总数时返回全部字段而不报错:调用方要接受样本变少的事实,否则下游按固定条数处理会出错。