原理:通过
SETNX
与DEL
命令实现SETNX lock 1 # 业务逻辑 ... DEL lock
处理业务逻辑时,可能出现异常导致删除锁失败,因此为锁添加过期时间
SET lock 1 EX 10 NX // 设置10秒过期时间 # 业务逻辑 ... DEL lock
线程1业务逻辑超时,导致锁被释放,线程2进场,但线程1业务逻辑处理完成时,删除了线程2的锁
为每个线程添加唯一标识
var uuid = pid
SET lock uuid EX 10 NX
# 业务逻辑
...
if REDIS.GET(lock) == uuid {
DEL lock
}
- 业务逻辑处理时间超过锁时间怎么办?锁时间如何预判?
没有好的预判方法,通过守护进程,定时(通过过期时间的1/3)检测失效时间,如果即将到期则续期,Java中也可以使用已封闭好的Redissiont处理
- Redis集群时,宕机失去锁时怎么办
使用redlock