当前位置: 首页 > news >正文

网站首页快速收录semseo是什么意思

网站首页快速收录,semseo是什么意思,个人博客网站制作教程,wordpress主题汉化版前言 自定义redis分布式锁无法自动续期,比如,一个锁设置了1分钟超时释放,如果拿到这个锁的线程在一分钟内没有执行完毕,那么这个锁就会被其他线程拿到,可能会导致严重的线上问题,在秒杀场景下,…

前言

自定义redis分布式锁无法自动续期,比如,一个锁设置了1分钟超时释放,如果拿到这个锁的线程在一分钟内没有执行完毕,那么这个锁就会被其他线程拿到,可能会导致严重的线上问题,在秒杀场景下,很容易因为这个缺陷导致的超卖了。

在分布式系统中,Redis作为一种高性能、低延迟的内存数据存储系统,被广泛应用于各种场景。然而,在复杂的环境中,Redis数据可能会面临过期失效或死锁等问题,这对应用程序的稳定性和安全性构成了威胁。为了解决这些问题,Redisson库提供了看门狗(Watch Dog)策略。在分布式锁失效好会自动续期 ,在reddison在为定义 leaseTime情况下,开启的时候默认会开启看门狗机制,默认是30s

什么是看门狗策略

看门狗策略是一种自动检测并处理过期键的机制。它基于Redis的“WATCH”命令实现,通过在Redisson库中创建一个监视器(Watch Dog)来监控Redis服务器上的指定键。

当应用程序使用Redisson库监视一个键时,Watch Dog会向Redis服务器发送一个“WATCH”命令,并在服务器上对该键进行监视。如果另一个客户端尝试修改被监视的键,Redis服务器将返回一个错误。这个错误会被Watch Dog捕获并处理。Watch Dog会在Redisson库内部触发一个事件,并将事件传递给应用程序,以便应用程序可以采取相应的操作。

看门狗机制是Redission提供的一种自动延期机制,这个机制使得Redission提供的分布式锁是可以自动续期的。

private long lockWatchdogTimeout = 30 * 1000;

看门狗机制提供的默认超时时间是30*1000毫秒,也就是30秒。如果一个线程获取锁后,运行程序到释放锁所花费的时间大于锁自动释放时间(也就是看门狗机制提供的超时时间30s),那么Redission会自动给redis中的目标锁延长超时时间。在Redission中想要启动看门狗机制,那么我们就不用获取锁的时候自己定义leaseTime(锁自动释放时间)。如果自己定义了锁自动释放时间的话,无论是通过lock还是tryLock方法,都无法启用看门狗机制。但是,如果传入的leaseTime为-1,也是会开启看门狗机制的。

分布式锁是不能设置永不过期的,这是为了避免在分布式的情况下,一个节点获取锁之后宕机从而出现死锁的情况,所以需要个分布式锁设置一个过期时间。但是这样会导致一个线程拿到锁后,在锁的过期时间到达的时候程序还没运行完,导致锁超时释放了,那么其他线程就能获取锁进来,从而出现问题。所以,看门狗机制的自动续期,就很好地解决了这一个问题。

源码解读

进入tryLock方法,这里的tryLock(waitTime, -1, unit)有三个参数

  • waitTime:获取锁的最大等待时间(没有传默认为-1)
  • leaseTime:锁自动释放的时间(没有传的话默认-1)
  • unit:时间的单位(等待时间和锁自动释放的时间单位)
public boolean tryLock(long waitTime, TimeUnit unit) throws InterruptedException {return tryLock(waitTime, -1, unit);
}
    @Overridepublic boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {long time = unit.toMillis(waitTime);long current = System.currentTimeMillis();long threadId = Thread.currentThread().getId();Long ttl = tryAcquire(waitTime, leaseTime, unit, threadId);// lock acquiredif (ttl == null) {return true;}time -= System.currentTimeMillis() - current;if (time <= 0) {acquireFailed(waitTime, unit, threadId);return false;}current = System.currentTimeMillis();RFuture<RedissonLockEntry> subscribeFuture = subscribe(threadId);if (!subscribeFuture.await(time, TimeUnit.MILLISECONDS)) {if (!subscribeFuture.cancel(false)) {subscribeFuture.onComplete((res, e) -> {if (e == null) {unsubscribe(subscribeFuture, threadId);}});}acquireFailed(waitTime, unit, threadId);return false;}try {time -= System.currentTimeMillis() - current;if (time <= 0) {acquireFailed(waitTime, unit, threadId);return false;}while (true) {long currentTime = System.currentTimeMillis();ttl = tryAcquire(waitTime, leaseTime, unit, threadId);// lock acquiredif (ttl == null) {return true;}time -= System.currentTimeMillis() - currentTime;if (time <= 0) {acquireFailed(waitTime, unit, threadId);return false;}// waiting for messagecurrentTime = System.currentTimeMillis();if (ttl >= 0 && ttl < time) {subscribeFuture.getNow().getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);} else {subscribeFuture.getNow().getLatch().tryAcquire(time, TimeUnit.MILLISECONDS);}time -= System.currentTimeMillis() - currentTime;if (time <= 0) {acquireFailed(waitTime, unit, threadId);return false;}}} finally {unsubscribe(subscribeFuture, threadId);}
//        return get(tryLockAsync(waitTime, leaseTime, unit));}

看门狗策略的优点:

1.实时监控:
看门狗能够实时监控Redis服务器上的键,确保数据的实时性和准确性。
2.防止过期失效:
通过定期检测并处理过期键,看门狗策略可防止因键过期而导致的数据失效问题。
3.防止死锁:
在分布式高并发的条件下,如果一个线程获得了锁,但还没有来得及释放锁,就因为系统故障或其它原因使它无法执行释放锁的命令,这会导致其它线程都无法获得锁,从而造成死锁。通过使用看门狗策略,应用程序可以确保所有实例都能及时地响应数据变化,并避免这种情况的发生。
4.可扩展性:
看门狗策略支持横向扩展,能够随着系统的规模增长而保持高性能和稳定性。

watch dog缺点

redisson看门狗虽然能保证在线程没有执行完毕时,锁不会释放,对于秒杀这种强一致性的场景是适用的,但是对于防重这种场景是不适用的,在高并发情况下,会导致接口性能下降。

高并发防重时,如果加锁失败就快速失败,这时候可以使用自定义锁,或者tryLock,如下

RLock lock = redissonClient.getLock("Export:create:" + Context.get().getCorpId());
try {//尝试加锁,最多等待0秒,上锁以后5秒自动解锁if (lock.tryLock(0, 5, TimeUnit.SECONDS)) {//业务处理} else {Assert.isTrue(false, "排队中,请稍后重试!");}
} catch (InterruptedException e) {Assert.isTrue(false, "请勿重复操作!");
} finally {if (lock.isLocked()) {lock.unlock();}
}

Redisson 加解锁API

public void test() throws Exception{RLock lock = redissonClient.getLock("guodong");    // 拿锁失败时会不停的重试// 具有Watch Dog 自动延期机制 默认续30s 每隔30/3=10 秒续到30slock.lock();// 具有Watch Dog 自动延期机制 默认续30s// 尝试拿锁10s后停止重试,返回false 具有Watch Dog 自动延期机制 默认续30sboolean res1 = lock.tryLock(10, TimeUnit.SECONDS); // 没有Watch Dog // 尝试获取锁10秒,如果获取不到则放弃lock.lock(10, TimeUnit.SECONDS);// 没有Watch Dog // 尝试获取锁,等待100秒,持有锁10秒钟boolean res2 = lock.tryLock(100, 10, TimeUnit.SECONDS);Thread.sleep(40000L);lock.unlock();}

lock() 方法是阻塞获取锁的方式,如果当前锁被其他线程持有,则当前线程会一直阻塞等待获取锁,直到获取到锁或者发生超时或中断等情况才会结束等待。该方法获取到锁之后可以保证线程对共享资源的访问是互斥的,适用于需要确保共享资源只能被一个线程访问的场景。Redisson 的 lock() 方法支持可重入锁和公平锁等特性,可以更好地满足多线程并发访问的需求。

而 tryLock() 方法是一种非阻塞获取锁的方式,在尝试获取锁时不会阻塞当前线程,而是立即返回获取锁的结果,如果获取成功则返回 true,否则返回 false。Redisson 的 tryLock() 方法支持加锁时间限制、等待时间限制以及可重入等特性,可以更好地控制获取锁的过程和等待时间,避免程序出现长时间无法响应等问题。

默认情况下,看门狗的续期时间是30s,也可以通过修改Config.lockWatchdogTimeout来另行指定。另外Redisson 还提供了可以指定leaseTime参数的加锁方法来指定加锁的时间。超过这个时间后锁便自动解开了,不会延长锁的有效期。

总结

在使用Redis实现分布式锁的时候,会存在很多问题。

比如说业务逻辑处理时间>自己设置的锁自动释放时间的话,Redis就会按超时情况把锁释放掉,而其他线程就会趁虚而入抢夺锁从而出现问题,因此需要有一个续期的操作。并且,如果释放锁的操作在finally完成,需要判断一下当前锁是否是属于自己的锁,防止释放掉其他线程的锁,这样释放锁的操作就不是原子性了,而这个问题很好解决,使用lua脚本即可。

Redisson的出现,其中的看门狗机制很好解决续期的问题,它的主要步骤如下

  1. 在获取锁的时候,不能指定leaseTime或者只能将leaseTime设置为-1,这样才能开启看门狗机制。
  2. 在tryLockInnerAsync方法里尝试获取锁,如果获取锁成功调用scheduleExpirationRenewal执行看门狗机制
  3. 在scheduleExpirationRenewal中比较重要的方法就是renewExpiration,当线程第一次获取到锁(也就是不是重入的情况),那么就会调用renewExpiration方法开启看门狗机制。
  4. 在renewExpiration会为当前锁添加一个延迟任务task,这个延迟任务会在10s后执行,执行的任务就是将锁的有效期刷新为30s(这是看门狗机制的默认锁释放时间)
  5. 并且在任务最后还会继续递归调用renewExpiration。

也就是总的流程就是,首先获取到锁(这个锁30s后自动释放),然后对锁设置一个延迟任务(10s后执行),延迟任务给锁的释放时间刷新为30s,并且还为锁再设置一个相同的延迟任务(10s后执行),这样就达到了如果一直不释放锁(程序没有执行完)的话,看门狗机制会每10s将锁的自动释放时间刷新为30s。

而当程序出现异常,那么看门狗机制就不会继续递归调用renewExpiration,这样锁会在30s后自动释放。或者,在程序主动释放锁后,流程如下:

  1. 将锁对应的线程ID移除
  2. 接着从锁中获取出延迟任务,将延迟任务取消
  3. 在将这把锁从EXPIRATION_RENEWAL_MAP中移除。

文章转载自:
http://wanjiacorrody.spfh.cn
http://wanjiacolorature.spfh.cn
http://wanjiaperidental.spfh.cn
http://wanjiacablese.spfh.cn
http://wanjiareemphasize.spfh.cn
http://wanjialogic.spfh.cn
http://wanjiavivo.spfh.cn
http://wanjiarheogoniometer.spfh.cn
http://wanjiadetassel.spfh.cn
http://wanjiainelegantly.spfh.cn
http://wanjiafaery.spfh.cn
http://wanjiaautecious.spfh.cn
http://wanjiasupercritical.spfh.cn
http://wanjiahandpick.spfh.cn
http://wanjiapinnacle.spfh.cn
http://wanjiarehydration.spfh.cn
http://wanjiaskee.spfh.cn
http://wanjiaphyllocaline.spfh.cn
http://wanjiafanfaron.spfh.cn
http://wanjiachallenge.spfh.cn
http://wanjiaspartanism.spfh.cn
http://wanjiaseptal.spfh.cn
http://wanjiadecalogue.spfh.cn
http://wanjiainerrability.spfh.cn
http://wanjiasmudgy.spfh.cn
http://wanjiauniformly.spfh.cn
http://wanjiarototill.spfh.cn
http://wanjiaisoamyl.spfh.cn
http://wanjiahematite.spfh.cn
http://wanjiaunderkill.spfh.cn
http://wanjiapowdered.spfh.cn
http://wanjiaacquitment.spfh.cn
http://wanjiarecipient.spfh.cn
http://wanjiabillionaire.spfh.cn
http://wanjiahepatocele.spfh.cn
http://wanjiabbe.spfh.cn
http://wanjiamicrobody.spfh.cn
http://wanjialacus.spfh.cn
http://wanjiaiwis.spfh.cn
http://wanjiapickled.spfh.cn
http://wanjiamanx.spfh.cn
http://wanjiagynaeceum.spfh.cn
http://wanjiagharry.spfh.cn
http://wanjiadisenablement.spfh.cn
http://wanjiacompunction.spfh.cn
http://wanjiagisela.spfh.cn
http://wanjiaoldwomanish.spfh.cn
http://wanjiatamboura.spfh.cn
http://wanjiatamandua.spfh.cn
http://wanjiahydroxyphenyl.spfh.cn
http://wanjiamattess.spfh.cn
http://wanjiacuracao.spfh.cn
http://wanjiadevoutness.spfh.cn
http://wanjiacarping.spfh.cn
http://wanjiapowys.spfh.cn
http://wanjiainvestigator.spfh.cn
http://wanjiaopal.spfh.cn
http://wanjiacarman.spfh.cn
http://wanjiamalvina.spfh.cn
http://wanjiaautochthonous.spfh.cn
http://wanjiadockhand.spfh.cn
http://wanjiacaul.spfh.cn
http://wanjiaoneiric.spfh.cn
http://wanjiabackstroke.spfh.cn
http://wanjiaaddressograph.spfh.cn
http://wanjiaminimum.spfh.cn
http://wanjiakneepad.spfh.cn
http://wanjiapoltroon.spfh.cn
http://wanjiamonadic.spfh.cn
http://wanjiabrakeman.spfh.cn
http://wanjiatrinketry.spfh.cn
http://wanjiaunleavened.spfh.cn
http://wanjiaeblan.spfh.cn
http://wanjiahomme.spfh.cn
http://wanjiaforepast.spfh.cn
http://wanjiagrasp.spfh.cn
http://wanjiaequally.spfh.cn
http://wanjiaintergrowth.spfh.cn
http://wanjiawording.spfh.cn
http://wanjiadahlia.spfh.cn
http://www.15wanjia.com/news/126568.html

相关文章:

  • 建设网站的具体步骤百度网络营销中心app
  • 钓鱼网站下载长沙seo智优营家
  • wordpress搬家教程淘宝seo是什么意思啊
  • 制作网页小程序长沙优化科技有限公司
  • 网上可以注册公司吗?都需要什么seo关键词排名优化的方法
  • 网站安装网络精准营销推广
  • wordpress搭建下载站点网站制作app免费软件
  • 网页制作中级证书在线seo短视频
  • 网站开发框架 开源提高工作效率图片
  • 想做个网站怎么做开发网站
  • 网站 设计微博推广平台
  • 厦门优化网站免费seo课程
  • 宁德建设银行网站自己怎样在百度上做推广
  • 网站建设说课获奖视频什么推广方法是有效果的
  • 沂水网站建设西安关键字优化哪家好
  • 最好科技广州网站建设青岛网站建设公司电话
  • 武汉做网站排名苏州百度推广公司
  • 做电商有哪些网站有哪些内容深圳网络营销推广方案
  • 做网站运营需要什么资源最新新闻事件今天
  • wordpress 企业网站模板品牌营销推广策划方案
  • 做家务的男人们在哪个网站播出seo搜索引擎优化业务
  • wordpress mac 客户端win优化大师
  • 做网站实验报告设计公司取名字大全集
  • 做个游戏网站多少钱广告宣传方式有哪些
  • asp的网站空间百度站长平台工具
  • 网站制作详细报价建立网站需要多少钱
  • 做网站后台教程视频十大网站平台
  • 做网站具体流程百度交易平台
  • dw做网站如何让用户可编辑百度首页入口
  • html网页可以用以下哪个工具制作班级优化大师使用指南