在 Redis 中,SET NX EX 是一种将设置键值对、条件判断和过期时间结合在一起的原子操作。它的完整语法格式为:
redis
SET key value NX EX seconds
核心参数说明
- NX (Not eXists) :仅当指定的键(key)不存在 时,才执行设置操作。如果键已存在,命令不执行并返回
nil。 - EX (EXpire) :设置键的过期时间,单位为秒。到达指定时间后,该键会被 Redis 自动删除。
核心优势:原子性
在早期的 Redis 版本中,开发者通常会先使用 SETNX 命令设置键,然后再使用 EXPIRE 命令设置过期时间。但这属于两条独立的命令,如果在执行 SETNX 后、执行 EXPIRE 前服务器发生崩溃,就会导致键被永久锁定(死锁)。
SET NX EX 将这两个步骤合并为单条原子命令,从根本上避免了竞态条件,确保了操作的绝对安全。
典型应用场景
该命令最经典的应用场景是实现分布式锁:
- NX 的作用:保证同一时刻只有一个客户端能够成功获取到锁。
- EX 的作用:为锁设置一个合理的超时时间。如果持有锁的客户端在执行任务期间崩溃,锁会在超时后自动释放,避免其他客户端永远无法获取锁。
- Value 的设计:建议将 value 设置为唯一的随机值(如 UUID),这样在释放锁时,可以校验当前锁是否属于自己,防止误删其他客户端持有的锁。
实际使用示例
假设我们需要为订单处理设置一个分布式锁,过期时间为 5 秒:
redis
SET lock:order:1001 "uuid-123456" NX EX 5
- 执行成功(获取锁) :返回
OK。 - 执行失败(锁已被占用) :返回
nil。
补充说明
除了 EX(秒),Redis 还支持使用 PX 参数来设置毫秒 级别的过期时间,例如 SET key value NX PX 5000。此外,如果需要在键已存在 时才更新值,可以使用 XX 参数替代 NX。在现代 Redis 开发中,强烈推荐使用这种组合命令来替代早期的 SETNX + EXPIRE 组合。