MSETNX 是什么
MSETNX 批量设置多个键值,但只在「所有给定键都不存在」时才全部写入:只要有一个键已经存在,整批操作全部放弃并返回 0。判断与写入在单条命令内原子完成,因此适合「首次初始化」这类需要一把梭落地的场景——例如初始化一组配置项,只有全都不存在才写入,避免覆盖已有值。
基本信息
| 语法 | MSETNX key value [key value ...] |
|---|---|
| 返回 | 1 表示全部写入成功;0 表示任一键已存在,整批未写入 |
| 原子性 | 判断与写入在同一条命令内完成,中途不会被插入其他操作 |
| 对比 MSET | MSET 无条件覆盖已有值 |
| 对比 SET NX | SET NX 是单键条件写,MSETNX 是整组条件写 |
典型使用场景
- 一次性初始化:一组配置键只有全部不存在时才写入,避免部分覆盖
- 幂等初始化脚本:脚本可重复执行,已有数据不会被覆盖
- 首次上线标记:配合版本标记键,确保初始化只发生一次
- 多键互斥写入:需要几个键保持一致状态时,用它避免写入一半
- 灰度新键:新版本引入的配置键组只在新环境初始化一次
行为演示
行为演示
# 全新键组:全部写入,返回 1
MSETNX config:mode prod config:ver 1
# 其中 config:ver 已存在:整批不写入,返回 0
MSETNX config:ver 2 config:x 9
# 逐键查看结果,确认没有被覆盖
MGET config:mode config:ver config:x
# 返回三行:prod、1、(nil)
# 对比:MSET 无条件覆盖
MSET config:ver 2
GET config:ver命令对比
| 命令 | 条件 | 部分写入可能 |
|---|---|---|
| MSET | 无条件覆盖 | 不适用(全部写入) |
| MSETNX | 全部键都不存在才写 | 不会,要么全写要么全不写 |
| SET NX | 单键不存在才写 | 单键场景的常用写法 |
| SET XX | 单键存在才更新 | 与 NX 相反的条件 |
MSETNX 的「全有或全无」语义常被误解成「逐键判断」:只要有一个键存在,其余键即使不存在也不会写入,靠返回值 0 就能判断整批失败。
集群环境下多键必须落在同一个哈希槽:键名不满足同槽规则时会报跨槽错误,需要用 hash tag(如 config:{app}:mode)把相关键归到同一槽。