目录
redis分布锁+lua 基本实现
这是我之前写的博客,除了文章末尾的redis锁续期的问题,在一篇公众号还说到另一个问题:
什么风险?
这种方式仍存在单点风险,以上实现在 Redis 正常运行情况下是没问题的,但如果存储锁对应key的那个节点挂了的话,就可能存在丢失锁的风险,导致出现多个客户端持有锁的情况,这样就不能实现资源的独享了。
什么意思?
我们举个栗子:现在有一个哨兵模式的redis集群,A获取主redis一个资源的锁,刚好master的redis锁还没有同步到从的redis上,这时master宕机了,这时A程序认为A还是有锁的对吧。这个是重点,A程序认为A具有锁,执行A事务。从redis顶替master redis作为主redis使用,这时B过来要同一个资源的锁,从redis没有同步A的锁,所以这时是没有人获得这个资源的锁(在redis上讲),B获取到这个资源的锁,执行B事务。那么这时AB都有锁,这跟分布式锁的原则违背了,互斥原则!
如何解决?
可以使用RedissionRedLok解决