• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    redis解决高并发看门狗策略的实现

    发布者: 姬7089 | 发布时间: 2025-6-19 12:45| 查看数: 87| 评论数: 0|帖子模式

    当一个业务执行时间超过自己设定的锁释放时间,那么会导致有其他线程进入,从而抢到同一个票,所有需要使用看门狗策略,其实就是开一个守护线程,让守护线程去监控key,如果到时间了还未结束,就会将这个key重新set一次,重置到原来的时间,只要主线程未结束,守护线程就会一直存在,这里还是会有一些问题,就是如果redis宕机了,导致第一个线程拿到了锁,第二个线程也拿到了锁,为了解决这个就需要引入红锁
    1. 导入依赖,这里导入依赖可能会和原先的redis依赖冲突,所以只能留下一个,不然可能会出错
    去除spring-boot-starter-data-redis
    1.   <!-- 集成Redis-->
    2.         <dependency>
    3.             <groupId>org.springframework.boot</groupId>
    4.             <artifactId>spring-boot-starter-data-redis</artifactId>
    5.         </dependency>
    复制代码
    添加redisson
    1.             <dependency>
    2.                 <groupId>org.redisson</groupId>
    3.                 <artifactId>redisson-spring-boot-starter</artifactId>
    4.                 <version>3.21.0</version>
    5.             </dependency>
    复制代码
    2. 修改配置文件,将之前的配置缓存redisson的
    1. spring:
    2.   data:
    3.     redis: # redis配置
    4.       url: redis://:127.0.0.1:6379
    复制代码
    3. 开始分布式锁-看门狗策略,找到高频访问的业务添加以下代码
    在业务方法开始的头添加

    在方法末尾添加释放锁,别忘了添加try-catch-finally块

    这是一段完整的分布式处理,有需要直接copy后修改即可
    1.   public void doConfirm(ConfirmOrderDoReq req) {
    2.         String lockKey = DateUtil.formatDate(req.getDate()) + "-" + req.getTrainCode();
    3.         RLock lock = null;
    4.         try {
    5.             lock = redissonClient.getLock(lockKey);

    6.             boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);

    7.             if (tryLock) {
    8.                 LOG.info("抢到锁,开始处理订单");
    9.             } else {
    10.                 LOG.info("很遗憾,没有抢到锁");
    11.                 //当前抢票人数多,请稍后再试
    12.                 throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_LOCK_FAIL);
    13.             }
    14.             //业务处理。。。。

    15.         } catch (InterruptedException e) {
    16.             LOG.error("抢票失败", e);
    17.             throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_LOCK_FAIL);
    18.         } finally {
    19.             LOG.info("锁被释放了");
    20.             // 释放锁
    21.             if (lock != null && lock.isHeldByCurrentThread()){
    22.                 lock.unlock();
    23.             }
    24.         }
    25.     }
    复制代码
    到此这篇关于redis解决高并发看门狗策略的实现的文章就介绍到这了,更多相关redis 高并发看门狗策略内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/database/3360547u1.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表