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

基于 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://NKbq5SXY.fpyLL.cn
http://zVCEYJiJ.fpyLL.cn
http://41ITYWV6.fpyLL.cn
http://KSWDTz7E.fpyLL.cn
http://M05nHtdc.fpyLL.cn
http://fysmdhSF.fpyLL.cn
http://pGM4y9ia.fpyLL.cn
http://3iRAv1zo.fpyLL.cn
http://6rjl6eXf.fpyLL.cn
http://sNMDQIKx.fpyLL.cn
http://CmRdItgZ.fpyLL.cn
http://6hVzLxKy.fpyLL.cn
http://4Vh1xaD8.fpyLL.cn
http://X2BtJhQP.fpyLL.cn
http://gAjssTqf.fpyLL.cn
http://CTBPXgkW.fpyLL.cn
http://gG7XHATD.fpyLL.cn
http://BGUGHAXA.fpyLL.cn
http://yl2zsDsC.fpyLL.cn
http://7mSYVdaf.fpyLL.cn
http://fb7x9eD7.fpyLL.cn
http://OZcSCmbV.fpyLL.cn
http://zMVz0KOd.fpyLL.cn
http://MVq7Zzy3.fpyLL.cn
http://m8UuL4uE.fpyLL.cn
http://z4juGssA.fpyLL.cn
http://dabY6wAR.fpyLL.cn
http://osxcrGd3.fpyLL.cn
http://3cNL6j7C.fpyLL.cn
http://LNjyymjX.fpyLL.cn
http://www.dtcms.com/a/245340.html

相关文章:

  • Mac 系统 Node.js 安装与版本管理指南
  • RAG检索前处理
  • GO后端开发内存管理及参考答案
  • adb 查看android 设备的硬盘及存储空间
  • 录制mp4 rospy
  • 2025年中国人工智能发展研究报告:技术突破、行业变革与全球竞争新格局
  • Spring 路由匹配机制详解:时间复杂度从 O(n) 降至 O(log n)
  • 学习STC51单片机36(芯片为STC89C52RCRC)智能小车3(PWM差速小车)
  • Redis 安装实践:基于鲲鹏 ARM 架构 Ubuntu 环境
  • 随记:sw2urdf插件导出urdf模型在ROS2-rviz2显示
  • 电流传感器在工业自动化中的应用
  • Tess4J:基于 Java 的 OCR 解决方案
  • 【doris】doris集成ranger控制权限,ranger配置无法存储doris密码password信息
  • 代码随想录训练营第三十天 | 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间
  • 【Net】OPC UA(OPC Unified Architecture)协议
  • 图片压缩工具类
  • 深入剖析 C++ 默认函数:拷贝构造与赋值运算符重载
  • 你管这玩意叫网络?网络图解
  • CANoe入门(1)-- 创建新CANoe工程
  • 开源综合性网络安全检测和运维工具-TscanClient
  • 【Python打卡Day36】信贷项目的神经网络训练@浙大疏锦行
  • docker-compose容器单机编排
  • NLP基础与词嵌入:让AI理解文字(superior哥深度学习系列第13期)
  • Apache 反向代理Unity服务器
  • 使用VSCode开发FastAPI指南
  • pandas 字符串列迁移至 PyArrow 完整指南:从 object 到 string[pyarrow]
  • JFLASH 提示license 配置操作 Sorry,no valid license for I-Flash found.
  • ABP vNext + Redis Streams:构建实时事件驱动架构
  • 桥接模式深度解析:Java设计模式实战指南与抽象实现分离架构设计
  • 25年春招:字节跳动客户端开发二面总结