(每步缺一不可)
- 获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此再释放锁的时候进行判断
- 获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁
- 释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放
(Redisson为了兼容新老版本,只要不是原子操作,就用lua脚本)
问题一:超时时间长短问题
解决:在加锁成功后,启动一个守护线程(Redission中的Watch dog),守护线程每隔1/3的锁的超时时间就去延迟锁的超时时间,当业务代码执行完成,关闭守护线程。
问题二:Redis主从切换导致锁失效问题
Redlock具有很大的争议。Redisson并不能有效的解决Redis的主从切换问题的,目前推荐使用Zookeeper分布式锁来解决。
基于大佬的精简版:大神详解