欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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

相关标签: 数据库