Redis分布式锁的原理是什么?如何续期?(redis分布式锁发生死锁怎么解决)

Redis分布式锁的原理是什么?如何续期?

分布式锁的需求产生

分布式锁的需求是伴随着应用分布式部署而来的,在单体应用,且只部署一台服务器的情况下,通过java的同步锁即可实现。同步锁,即是一个原子性的操作。

那么当应用进行了分布式部署,应用有多个服务,这个时候应用服务端就没有一个可提供原子性操作的地方了,Redis性能高,且是单线程,因此可提供一个原子性操作的地方,利用它,就可以实现分布式锁。

用场景说话,使用Redis分布式锁的场景如下图所示:

如下图所示,随后会根据场景说明分布式锁及续期相关问题的来龙去脉。

  1. 图中序号1:进来一个请求,这个请求要求我们保存一个“订单A”;
  2. 图中序号2:2.1 步,请求进来,首先去尝试设置一个Redis 值,他的键就是订单号“订单A”,如果尝试成功,则代表我这个线程是第一次设置,相当于我拿到了这个锁;如果尝试失败,那么,可以抛出异常或者等待一段时候后再次重试,这里可以根据业务场景的不同采取不同的策略。这里的关键是在Redis中的操作是单线程的,因此该操作是原子性的。2.2步,为了防止应用服务意外中断,Redis中的数据一直存活,消耗资源,需要设置一个超时时间。(如果为了严谨,可以将2.1, 2.2 两步封装成一个lua脚本部署在Redis服务器上)
  3. 图中序号3:情况A,这个时候是当Redis的key还未失效,程序就已经执行完成,且删除了Redis中的数据,一切正常;情况B:就是需要续期的场景,如果要避免这个场景的出现,可以将Redis key的失效时间设置长一点,可以应对大多数业务。如果要彻底解决,可以在应用端添加一个Redis锁的注册中心,然后起一个监听线程去监听这个注册中心,发现有锁还在被持有,但是Redis 已经快过期了,则修改相应key的失效时间,进行续期。

在传统单体应用单机部署的情况下,并发问题可以通过使用Java并发相关的锁如synchronized,但是当规模上升到分布式集群的情况下,要控制共享资源访问,就需要通过分布式锁来实现。常见的分布式锁方案如数据库乐观锁,Redis锁,zk锁等。

Redis分布式锁可以有多种方式实现但是其核心就是通过以下三个Redis命令组合实现。

上面为Redis的一个最简单的锁实现原理,实际中还需要考虑更多具体的情况作出相应的调整。如

实际开发环境中不确定的因素有很多,需要慢慢地去调整实践达到理想状态,可以考虑使用redisson框架来实现。

这个情况比较独特,出现这个问题的根本原因在于锁失效的时间小于业务处理的时间导致业务还没处理完毕锁就释放了。那么解决方案是合理地结合业务去设置锁失效的时间。

但是也有更好的方案就如前文提到的redisson,其中的可重入锁概念。


默认情况下,加锁的时间是30秒.如果加锁的业务没有执行完,那么到 30-10 = 20秒的时候,就会进行一次续期,把锁重置成30秒。

什么时候需要分布式锁?

作为BAT的Java web开发工程师来回答这个问题。

分布式锁是目前Java web开发过程中常见的一个情况,接下来,我从场景以及如何实现两个维度来分析。

当你的后端服务是以集群形式存在的时候,是一定需要分布式锁的。集群与分布式不同,而这里的分布式与分布式锁也不是同一回事儿。集群可以指多台服务器实现了同样的需求,比如有三台Tomcat,都负责查询模块;而分布式指多台服务器各自不同的功能点,多台功能的整合对外是一个完整的服务,比如一台Tomcat负责查询,一台负责下单。

说回集群,当后端集群要去访问同一个资源的时候,就需要对该资源加锁,保证同一时刻只能有一个对象来修改该资源数据,如果不加锁会导致什么情况呢?

举一个例子:

有两个线程(分别叫T1,T2)做的都是同样的事情,拿到一个叫做A的资源,然后对其进行+1操作。由于线程之间是不会互相通信的,于是就有可能出现下面这种情况:

T1拿到A,读入内存,此时A值为T;

T2拿到A,读入内存,此时A值为T;

T1进行+1操作,此时A实际值为T+1;

到此,以上就是小编对于redis分布式锁失效问题的问题就介绍到这了,希望这2点解答对大家有用。

网站题目:Redis分布式锁的原理是什么?如何续期?(redis分布式锁发生死锁怎么解决)
转载来源:http://www.shufengxianlan.com/qtweb/news48/465848.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联