Redis SETNX 分布式锁实战指南
回答
-
这里,利用 Redis 的单线程特性,多个Redis客户端同时通过
SETNX命令尝试获取锁。如果,返回1表示获取锁成功,否则表示获取锁失败。Redis Setnx(SET if Not Exists)命令,在指定的 key 不存在时,为 key 设置指定的值。
设置成功,返回1。
设置失败,返回0。
-
分布式锁,实践经验分享
- 获取锁成功,则设置一个过期时间,防止该客户端挂了之后一直持有该锁。
- 释放锁的时候,需要先判断该锁是否仍然属于该客户端,如果是,则通过DEL命令释放锁。
-
SETNX 命令,实践经验分享
SETNX 命令自身是不支持设置超时时间的,一般是结合 EXPIRE 一起使用。
常见用法:
SETNX key value EXPIRE key 10
或者:
SET key value EX 10 NX
扩展
1、此方案优点
-
实现简单
SETNX 命令实现简单,易于理解和使用
-
性能较高
由于,SETNX 命令的执行原子性,保证了分布式锁的正确性,
而且,在Redis中,SETNX 命令是单线程执行的,所以性能较高。
2、此方案缺点
-
锁无法续期
如果,加锁方在加锁后的执行时间较长,而锁的超时时间设置的较短,可能导致锁被误释放。
-
可能产生死锁
如果,加锁方在加锁后未能及时解锁(也未设置超时时间),且该客户端崩,可能导致死锁。
-
存在竞争
由于 SETNX 命令是对 Key 的操作。
所以,在高并发情况下,多个客户端之间仍可能存在竞争,从而影响性能。
-
setnx 不可重入
可以借助redission封装的能力实现可重入锁