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

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>

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();
            }
        }
    }

相关文章:

  • 【Pandas】pandas Series idxmin
  • 13-跳跃游戏 II
  • 【Linux】关于Docker的一系列问题。尤其是拉取东西时的网络问题,镜像源问题。
  • Linux:TCP和守护进程
  • 数据分析的AI+流程(个人经验)
  • 【C/C++】内存屏障概念、原理和用途
  • 以下是 HTML 与 HTML5 的核心区别及从基础到高级的总结:
  • 构建了一个 Linux 发行版,基于Debian和WattOS的
  • 关于Node.js前端面试的试题概念、工作原理及实际应用
  • 涌现之谜:神经网络中的意识幻象与信息熵变
  • 实例研究:设计一个文档编辑器(24)- 完
  • OpenGL ES - 数学基础
  • PLC通信交互系统技术分享
  • RDMA 高性能通信技术原理
  • 50页PDF|数字化转型成熟度模型与评估(附下载)
  • 人工智能3d点云之Pointnet++项目实战源码解读(点云分类与分割)
  • 自然语言处理:第九十章 如何使用Jina API进行语义切分
  • 王炸 用AI+飞书 分解 一键生成 项目计划表模版
  • AF3​​​​​​​ parse函数解读
  • 以下是C++从入门到精通的学习路径及实践方法,结合系统学习框架与实战经验,帮助普通人和程序员高效掌握并开发第一个产品
  • 外交部发言人就澳大利亚联邦大选结果答记者问
  • 江西望仙谷回应“游客凌晨等不到接驳车”:已限流,接驳车运行时间延长
  • 辛涛任山东第一医科大学副校长,曾为“博士服务团”成员
  • 本周看啥|《乘风》迎来师姐们,《天赐》王蓉搭Ella
  • 韩国代总统、国务总理韩德洙宣布辞职,将择期宣布参选总统
  • 五大光伏龙头一季度亏损超80亿元,行业冬天难言结束