写点什么

高并发下的 Redis 分布式锁

用户头像
java_wxid
关注
发布于: 2021 年 03 月 30 日
高并发下的Redis分布式锁

redis 使用 setnx 作为分布式锁,多个线程 setnx 调用时,有且仅有一个线程会拿到这把锁,所以拿到锁的执行业务代码,最后释放掉锁。

加大了调用次数,执行业务代码需要一点时间,这段时间拒绝了很多等待获取锁的请求。

假如 redis 服务挂掉了,抛出异常了,这时锁不会被释放掉,出现死锁问题,可以添加 try finally 处理,Redis 服务挂掉导致死锁的问题解决了,但是,如果服务器果宕机了,又会导致锁不能被释放的现象,所以可以设置超时时间为 10s。

如果有一个线程执行需要 15s,当执行到 10s 时第二个线程进来拿到这把锁,会出现多个线程拿到同一把锁执行,在第一个线程执行完时会释放掉第二个线程的锁,以此类推…就会导致锁的永久失效。

所以,只能自己释放自己的锁,可以给当前线程取一个名字,永久失效的问题解决了,但是,如果第一个线程执行 15s,还是会存在多个线程拥有同一把锁的现象。

所以,需要续期超时时间,当一个线程执行 5s 后对超时时间进行续期都 10s,就可以解决了,续期设置可以借助 redission 工具,加锁成功,后台新开一个线程,每隔 10 秒检查是否还持有锁,如果持有则延长锁的时间,如果加锁失败一直循环(自旋)加锁。


发布于: 2021 年 03 月 30 日阅读数: 14
用户头像

java_wxid

关注

Java开发,CSDN博客专家,自媒体工作者。 2021.03.30 加入

我是廖志伟,一名java开发工程师,CSDN博客专家,多年一线研发经验,曾就职多家互联网公司,任Java开发工程师职位,参与多个千万级并发互联网产品研发,对大型分布式,高并发及微服务架构有非常深入研究。

评论

发布
暂无评论
高并发下的Redis分布式锁