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

企业网站建设的过程wordpress 注册邮件

企业网站建设的过程,wordpress 注册邮件,中山网站建设是什么意思,wordpress all in one前言 自定义redis分布式锁无法自动续期#xff0c;比如#xff0c;一个锁设置了1分钟超时释放#xff0c;如果拿到这个锁的线程在一分钟内没有执行完毕#xff0c;那么这个锁就会被其他线程拿到#xff0c;可能会导致严重的线上问题#xff0c;在秒杀场景下#xff0c;…前言 自定义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获取锁的最大等待时间没有传默认为-1leaseTime锁自动释放的时间没有传的话默认-1unit时间的单位等待时间和锁自动释放的时间单位 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();RFutureRedissonLockEntry 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/310 秒续到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的出现其中的看门狗机制很好解决续期的问题它的主要步骤如下 在获取锁的时候不能指定leaseTime或者只能将leaseTime设置为-1这样才能开启看门狗机制。在tryLockInnerAsync方法里尝试获取锁如果获取锁成功调用scheduleExpirationRenewal执行看门狗机制在scheduleExpirationRenewal中比较重要的方法就是renewExpiration当线程第一次获取到锁也就是不是重入的情况那么就会调用renewExpiration方法开启看门狗机制。在renewExpiration会为当前锁添加一个延迟任务task这个延迟任务会在10s后执行执行的任务就是将锁的有效期刷新为30s这是看门狗机制的默认锁释放时间并且在任务最后还会继续递归调用renewExpiration。 也就是总的流程就是首先获取到锁这个锁30s后自动释放然后对锁设置一个延迟任务10s后执行延迟任务给锁的释放时间刷新为30s并且还为锁再设置一个相同的延迟任务10s后执行这样就达到了如果一直不释放锁程序没有执行完的话看门狗机制会每10s将锁的自动释放时间刷新为30s。 而当程序出现异常那么看门狗机制就不会继续递归调用renewExpiration这样锁会在30s后自动释放。或者在程序主动释放锁后流程如下 将锁对应的线程ID移除接着从锁中获取出延迟任务将延迟任务取消在将这把锁从EXPIRATION_RENEWAL_MAP中移除。
http://www.w-s-a.com/news/439077/

相关文章:

  • 开发区全力做好网站建设网络广告营销成功案例
  • 114网站建设高并发系统架构
  • php网站打开一片空白wordpress中文广告插件下载
  • 怎样建自己的网站免费的百度关键词排名点击
  • 医院网站建设的特点怎么查看网站百度快照
  • 网站 如何备案一般网站开发公司
  • 做网站的公司 贵阳郑州新像素ui设计培训收费
  • 温州网站建设公司电话给个免费的网址
  • 个人做电子商务网站备案软考高级
  • 淘宝客需要自己做网站吗四川遂宁做网站的公司
  • 编写网站策划书缘魁上海网站建设
  • 梧州外贸网站推广设计wordpress 上传 七牛
  • 增加网站备案千灯做网站
  • 深圳做网站的公php做简易网站
  • 徐州哪家做网站好商业空间设计效果图
  • 重庆建网站cqiezscom大学毕业做网站插画师好吗
  • 在门户网站做产品seo怎么样做网站管理员
  • 动画做视频在线观看网站字体安装+wordpress
  • vs2015网站开发做珠宝建个网站推广怎么样
  • 大桥外语官方网站星做宝贝佛山微信网站开发
  • 河南建设网站公司哪家好怎样做一家网站
  • 安阳市哪里做网站建设网站流量怎么赚钱
  • 网站开发与优化课程总结软件班级网站建设
  • py网站开发wordpress 公司网站 模板 下载
  • 长春城乡建设部网站首页英文网站推广服务
  • wordpress实训上海整站seo
  • 福建自己建设网站义乌市企推网络科技有限公司
  • 宁波优化网站哪家好织梦网站地图怎么做
  • 怎么在自己的网站加关键词烟台企业网站建设
  • 中山网站建设界面设计职业技能等级证书