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

基于 Redis 的幂等性设计:SpringBoot @Async 在高并发 MySQL 日志存储中的应用

一、问题描述

在高并发场景下,大量设备实时上报状态数据,需要异步保存到MySQL,同时需要解决幂等性校验和线程池耗尽问题。

二、解决方案

1. 幂等性控制

作用:确保同一请求无论执行多少次,结果都一致,避免重复处理。

实现方式

  • 唯一标识:设备ID + 时间戳组合
  • Redis原子操作:SET NX EX实现原子校验
  • 多级保障:Redis快速判断 + 数据库唯一索引 + 业务层查询确认
  • 超时机制:设置合理过期时间,避免永久占用资源

2. 防止线程池耗尽

策略

  • 合理配置线程池
    • 核心线程数:CPU核心数×2
    • 最大线程数:100
    • 队列容量:500
    • 拒绝策略:CallerRunsPolicy(压力返回调用方)
  • 快速失败:幂等校验快速过滤重复请求
  • 监控告警:建议添加线程池监控指标

3. 异步处理模式

CompletableFuture等待结果模式

  • 控制器等待异步操作完成后返回结果
  • 设置超时时间(5秒)避免无限等待
  • 超时返回HTTP 202状态码,提供状态查询接口

三、示例

1.Controller

@PostMapping("/{deviceId}/status")
public ResponseEntity<?> reportStatus(@PathVariable String deviceId,@RequestParam("timestamp") long timestamp,@RequestBody DeviceStatus status) {String requestId = "device:" + deviceId + ":status:" + timestamp;try {// 等待异步操作完成(最多5秒)deviceStatusService.processDeviceStatus(requestId, deviceId, timestamp, status).get(5, TimeUnit.SECONDS);return ResponseEntity.ok().build();} catch (TimeoutException e) {return ResponseEntity.accepted().header("X-Request-ID", requestId).build();} catch (Exception e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();}
}

2.Service

@Async("deviceStatusExecutor")
public CompletableFuture<Void> processDeviceStatus(
http://www.xdnf.cn/news/13834.html

相关文章:

  • Vue3+TypeScript实现迭代器模式
  • FOC电机三环控制
  • aws s3 sdk c++使用指南、适配阿里云oss和aws
  • 「Java EE开发指南」如何用MyEclipse创建一个WEB项目?(一)
  • DDcGAN_codes
  • 【python】执行deactivate没有关闭虚拟环境
  • 交易所 java, web3 交易所简易模块
  • [SKE]CPU 与 GPU 之间数据加密传输的认证与异常处理
  • 【线程与线程池】线程数设置(四)
  • 线程池启动报null :Caused by: java.lang.IllegalArgumentException: null
  • 每日学习一道数模题-2024国赛B题-生产过程中的决策问题
  • ViT架构所需的大型训练集
  • 在 IntelliJ IDEA 中运行时出现“Log already in use? tmlog in ./“
  • Python数据可视化艺术:社交网络关系图制作
  • parquet批量读取图片文件示例
  • 树莓派5 ubuntu 24.04 docker配置镜像Docker pull时报错:https://registry-1.docker.io/v2/
  • 机器学习与深度学习21-信息论
  • 项目名称:基于计算机视觉的夜间目标检测系统
  • map与set的模拟实现
  • ABAP零碎记录
  • 事件(Event)
  • 56、原生组件注入-原生注解与Spring方式注入
  • 录制mp4 rospy
  • 数字人分身系统源码开发功能深度解析
  • 基于算力魔方与PP-OCRv5的OpenVINO智能文档识别方案
  • CSS实现元素撑满剩余空间的5种方法
  • Linux启动流程和内核管理自我总结
  • 杭州公司一面java题目和解答
  • 2025最新版使用VSCode和CMake图形化编译调试Cuda C++程序(保姆级教学)
  • IOT集群扩容实践:问题剖析与解决策略