redisson 坑与bug
程序员文章站
2022-07-08 09:54:39
项目本来用redisson 来实现分布式锁,但是经过测试发现,如果redis被kill调 然后重启,或者笔记本进入休眠状态然后打开笔记本, redisson 的锁会失效,无法起到锁住代码块的作用,原因:redission底层是netty来实现与redis进行交互,几乎每300多毫秒发送一次if (redis.call(‘hexists’, KEYS[1], ARGV[2]) == 1) then redis.call(‘pexpire’, KEYS[1], ARGV[1]); 的lua命令给redi...
项目本来用redisson 来实现分布式锁,但是经过测试发现,如果redis被kill调 然后重启,或者笔记本进入休眠状态然后打开笔记本, redisson 的锁会失效,无法起到锁住代码块的作用,
原因:
redission底层是netty来实现与redis进行交互,几乎每300多毫秒发送一次
if (redis.call(‘hexists’, KEYS[1], ARGV[2]) == 1) then redis.call(‘pexpire’, KEYS[1], ARGV[1]); 的lua命令给redis,来让锁的key实现自动扩充失效期,但是遗憾的是,经过上面我说的几点测试发现,锁失效是由于redission底层无法再对redis的锁key进行失效期续命,从而导致锁定代码块失败,默认的锁失效期是30秒,
举个失败的例子,a进程拿到锁(锁的key生存期默认是30秒),如果不进行释放,那么redission会给锁key进行续命,进程b拿锁是阻塞的,但是现实出现了意外,redission不给key续命了,这时只要过了30秒那么b就可以拿到锁了,b拿到锁后依然不会续命…
redission到底哪行代码出了问题,有时间再仔细研究
本文地址:https://blog.csdn.net/zw521cx/article/details/107577632
下一篇: Service的简单使用