首页/数据/数据库速查/SETNX / SET NX 的区别与用法
本包目录(495 条)
MySQL 基础与连接36 条SQL 语法52 条用户与权限21 条备份与恢复56 条主从复制与高可用53 条性能与调优57 条
Redis 命令96 条
Redis 运维与场景124 条

SETNX / SET NX 的区别与用法

SETNX 是「不存在才设置」的历史命令:不能带过期,只能配合 EXPIRE;等价于 SET key value NX。锁与去重场景建议直接用 SET NX PX 一条原子完成。

数据库速查数据更新于 2026-10-12
用途仅当键不存在时写入(不存在才成功)
语法SETNX key value;等价 SET key value NX
返回1 成功 / 0 已存在

两种写法对比

两种写法对比
SETNX job:sync:20261012 1        # 成功返回 1
EXPIRE job:sync:20261012 3600    # 必须补过期,两条命令非原子

SET job:sync:20261012b 1 NX EX 3600   # 一条搞定,推荐
SET job:sync:20261012b 1 NX PX 5000   # 锁场景用毫秒级
SETNX + EXPIRE 之间存在崩溃窗口:拿到键还没设过期就挂掉,键永久残留(经典死锁成因);用 SET ... NX EX 单条原子命令规避。

易错点

  • 用 SETNX 做锁却不设过期:客户端崩溃后锁永不释放
  • A 设了 SETNX 但 B 直接 DEL 释放:没校验持有者身份,误删别人的锁(见分布式锁篇)

数据来源与参考

  • Redis 官方文档: SETNX
  • Redis 官方文档: SET

相关工具

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