域名绑定ip网站吗,如何做微信小程序店铺,找外包公司做网站的好处和坏处,手机网页开发模板当一个业务执行时间超过自己设定的锁释放时间#xff0c;那么会导致有其他线程进入#xff0c;从而抢到同一个票,所有需要使用看门狗策略#xff0c;其实就是开一个守护线程#xff0c;让守护线程去监控key#xff0c;如果到时间了还未结束#xff0c;就会将这个key重新s… 当一个业务执行时间超过自己设定的锁释放时间那么会导致有其他线程进入从而抢到同一个票,所有需要使用看门狗策略其实就是开一个守护线程让守护线程去监控key如果到时间了还未结束就会将这个key重新set一次重置到原来的时间只要主线程未结束守护线程就会一直存在这里还是会有一些问题就是如果redis宕机了导致第一个线程拿到了锁第二个线程也拿到了锁为了解决这个就需要引入红锁 1. 导入依赖这里导入依赖可能会和原先的redis依赖冲突所以只能留下一个不然可能会出错 去除spring-boot-starter-data-redis !-- 集成Redis--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency 添加redisson dependencygroupIdorg.redisson/groupIdartifactIdredisson-spring-boot-starter/artifactIdversion3.21.0/version/dependency 2. 修改配置文件,将之前的配置缓存redisson的 spring:data:redis: # redis配置url: redis://:127.0.0.1:6379 3. 开始分布式锁-看门狗策略找到高频访问的业务添加以下代码 在业务方法开始的头添加 在方法末尾添加释放锁别忘了添加try-catch-finally块 这是一段完整的分布式处理,有需要直接copy后修改即可 public void doConfirm(ConfirmOrderDoReq req) {String lockKey DateUtil.formatDate(req.getDate()) - req.getTrainCode();RLock lock null;try {lock redissonClient.getLock(lockKey);boolean tryLock lock.tryLock(0, TimeUnit.SECONDS);if (tryLock) {LOG.info(抢到锁开始处理订单);} else {LOG.info(很遗憾没有抢到锁);//当前抢票人数多请稍后再试throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_LOCK_FAIL);}//业务处理。。。。} catch (InterruptedException e) {LOG.error(抢票失败, e);throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_LOCK_FAIL);} finally {LOG.info(锁被释放了);// 释放锁if (lock ! null lock.isHeldByCurrentThread()){lock.unlock();}}}