SETNX
使用方法:SETNX(SET if Not eXists)是 Redis 中一个经典的用于设置分布式锁的命令。它的作用是当指定的键不存在时,才会设置该键的值,如果键已经存在则不做任何操作。但 SETNX 本身不支持直接设置过期时间。
坏处:为了避免死锁(例如持有锁的客户端崩溃而未释放锁),需要额外使用 EXPIRE 命令来为锁设置过期时间。然而,SETNX 和 EXPIRE 是两个独立的命令,在高并发场景下,可能会出现 SETNX 执行成功,但在执行 EXPIRE 之前客户端崩溃的情况,这样就会导致锁没有设置过期时间。他们不是一个原子操作。
setIfAbsent
使用方法:setIfAbsent(key, value, expireTime, TimeUnit.SECONDS) 是 Spring Data Redis 对 Redis 中 SET key value NX PX timeout 命令的封装。这个命令将设置键值对、判断键是否存在以及设置过期时间这三个操作合并为一个原子操作。