当一个业务执行时间超过自己设定的锁释放时间,那么会导致有其他线程进入,从而抢到同一个票,所有需要使用看门狗策略,其实就是开一个守护线程,让守护线程去监控key,如果到时间了还未结束,就会将这个key重新set一次,重置到原来的时间,只要主线程未结束,守护线程就会一直存在,这里还是会有一些问题,就是如果redis宕机了,导致第一个线程拿到了锁,第二个线程也拿到了锁,为了解决这个就需要引入红锁
- 导入依赖,这里导入依赖可能会和原先的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>
修改配置文件,将之前的配置缓存redisson的
spring:
data:
redis: # redis配置
url: redis://:127.0.0.1:6379开始分布式锁-看门狗策略,找到高频访问的业务添加以下代码
在业务方法开始的头添加
在方法末尾添加释放锁,别忘了添加try-catch-finally块
这是一段完整的分布式处理,有需要直接copy后修改即可
javapublic 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(); } } }
redis解决高并发看门狗策略
小汤猿人类2025-02-18 6:04
相关推荐
guodingdingh1 小时前
软件开发工作问题总结0718咖啡八杯3 小时前
GoF设计模式——解释器模式优橙教育3 小时前
5G网优培训 vs Java开发:转行选哪个?糖果店的幽灵3 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理腻害兔4 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!碎光拾影5 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现Miao121316 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施腻害兔6 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计爬也要爬着前进7 小时前
redis主从搭建CRMEB系统商城7 小时前
开源自建还是SaaS订阅?算一笔3年经济账
