您现在的位置是:主页 > news > 网站设计布局/百度首页排名优化平台
网站设计布局/百度首页排名优化平台
admin2025/6/2 17:15:16【news】
简介网站设计布局,百度首页排名优化平台,找个专门做各种外卖的网站,营销型网站的推广实现一把可靠的分布式锁 在这种分布式应用、中间件盛行的时代,我相信对于开发同学来讲,分布式锁不会是一个陌生的概念。 那么怎么样能用Redis实现一把合格的分布式锁呢? 一般使用Redis实现分布式锁,都是利用Redis是第三方中间件…
实现一把可靠的分布式锁
在这种分布式应用、中间件盛行的时代,我相信对于开发同学来讲,分布式锁不会是一个陌生的概念。
那么怎么样能用Redis实现一把合格的分布式锁呢?
一般使用Redis实现分布式锁,都是利用Redis是第三方中间件的特性,用来实现一把适用于分布式场景的锁。
通过这个方法,如果Redis数据库中没有这个键的话就设置成功,就是获取到了锁;如果有这个键的话就是设置失败,就没有获取到锁。
SETNX key value
然后,在完成业务代码之后删除这段代码,删除这个key,释放锁。
为了保证我们就算代码出错也要释放掉这个锁,要把删除锁的操作放到finally代码块里面。
这样就是一把可靠的分布式锁了吗?
如果我获取锁成功,还没有执行finally代码块,这时候应用挂了,是不是锁就永远不能被释放了呢?
所以我们设置锁的时候要加一个过期时间,用来保证这个锁一定会被释放掉。
如果设置过期时间和加锁是两个命令,那么在两个命令之间挂了也是有可能的,所以我们要用一条命令来完成这两个操作,或者使用lua脚本来保证操作的原子性。
那么一条线程在执行的时候超时了,锁到时间被删除了,这时候又一个线程获取到了锁,第一个线程执行完了去释放的时候释放的就是第二个线程的锁,就会造成错乱。所以我们加锁设置值的时候需要设置一下随机值,保证我设置的锁,只有我们删除。
那么这个超时时间到底要设置成多少呢?多少感觉都不合适,总有可能线程执行的太慢导致锁被删除的情况发生。所以我们可以实现一个看门狗(一般是过期时间的三分之一),使用一个异步线程去看锁是不是还在,还在的话就延长时间。保证锁不会被删除。
最后就是在请求分布式锁的时候没有获取到,要循环获取,不能直接返回。