首页/数据/数据库速查/MSETNX 全不存在才批量写入
Redis 命令96 条

MSETNX 全不存在才批量写入

原子地批量设置多个键:仅当所有键都不存在时才全部写入,任一键已存在则整批放弃(返回 0);适合「首次初始化」类场景。

数据库速查数据更新于 2026-10-13

MSETNX 是什么

MSETNX 批量设置多个键值,但只在「所有给定键都不存在」时才全部写入:只要有一个键已经存在,整批操作全部放弃并返回 0。判断与写入在单条命令内原子完成,因此适合「首次初始化」这类需要一把梭落地的场景——例如初始化一组配置项,只有全都不存在才写入,避免覆盖已有值。

基本信息

语法MSETNX key value [key value ...]
返回1 表示全部写入成功;0 表示任一键已存在,整批未写入
原子性判断与写入在同一条命令内完成,中途不会被插入其他操作
对比 MSETMSET 无条件覆盖已有值
对比 SET NXSET 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)把相关键归到同一槽。

易错点

  • 以为它逐键判断:任一键存在就整批放弃,与逐键设置的直觉完全相反
  • 用返回 0 判断「键已存在」的具体是哪一个:返回值不告诉你是哪个键冲突,需要另外查询确认
  • 集群下多键不同槽:直接报跨槽错误,键名要设计成一槽
  • 把它当覆盖写使用:它恰恰不做覆盖,需要在已有值上更新时应使用 MSET
  • 键组数量过多:单条命令参数太大同样会阻塞与占用带宽,初始化键组应控制在合理规模

数据来源与参考

  • Redis 官方文档: MSETNX
  • Redis 官方文档: MSET

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌