redis解决高并发看门狗策略

当一个业务执行时间超过自己设定的锁释放时间,那么会导致有其他线程进入,从而抢到同一个票,所有需要使用看门狗策略,其实就是开一个守护线程,让守护线程去监控key,如果到时间了还未结束,就会将这个key重新set一次,重置到原来的时间,只要主线程未结束,守护线程就会一直存在,这里还是会有一些问题,就是如果redis宕机了,导致第一个线程拿到了锁,第二个线程也拿到了锁,为了解决这个就需要引入红锁

  1. 导入依赖,这里导入依赖可能会和原先的redis依赖冲突,所以只能留下一个,不然可能会出错

去除spring-boot-starter-data-redis

  <!-- 集成Redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

添加redisson

            <dependency>
                <groupId>org.redisson</groupId>
                <artifactId>redisson-spring-boot-starter</artifactId>
                <version>3.21.0</version>
            </dependency>
  1. 修改配置文件,将之前的配置缓存redisson的

    spring:
    data:
    redis: # redis配置
    url: redis://:127.0.0.1:6379

  2. 开始分布式锁-看门狗策略,找到高频访问的业务添加以下代码

在业务方法开始的头添加

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

这是一段完整的分布式处理,有需要直接copy后修改即可

java 复制代码
  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();
            }
        }
    }
相关推荐
苹果酱056715 分钟前
玩转SpringCloud Stream
java·spring boot·毕业设计·layui·课程设计
拾忆,想起26 分钟前
Spring 和 Spring MVC 的关系是什么?
java·spring boot·spring·spring cloud·微服务
FLZJ_KL1 小时前
【设计模式】【结构型模式】桥接模式(Bridge)
java·设计模式·桥接模式
万添裁1 小时前
stream流常用方法
java·开发语言
魔镜前的帅比1 小时前
Java 语法新特性(Records、Pattern Matching、Sealed Classes)深度解析(11/17/21)✨
java·开发语言
Q1X11 小时前
【实用工具】在 Windows 上使用 JVMS 管理多版本 JDK
java·开发语言·windows
无限大62 小时前
算法精讲--动态规划四步法则
java·算法·程序员
-$_$-2 小时前
【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步
数据库·redis·缓存
天天向上vir2 小时前
缓存三大问题及其解决方案
java·redis·mysql
宇神城主_蒋浩宇2 小时前
大道至简 少字全意 易经的方式看 缓存 mybatis缓存 rendis缓存场景 案例
java·缓存·mybatis