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

redisTemplate简单实现幂等性校验

@Service
public class MessageConsumerService {private final StringRedisTemplate redisTemplate;private static final String PROCESSED_MSG_KEY = "processed_msgs";private static final long EXPIRE_TIME = 7;  // 过期时间(天)public MessageConsumerService(StringRedisTemplate redisTemplate) {this.redisTemplate = redisTemplate;}public void processMessage(String msgId, String payload) {// 1. 原子性检查消息是否已处理 + 添加到已处理集合;设置过期时间,避免集合无限增长Boolean added = redisTemplate.opsForSet().add(PROCESSED_MSG_KEY, msgId,7, TimeUnit.DAYS);// 2. 如果返回 null 或 false,表示消息已存在,直接返回if (added == null || !added) {log.info("消息已处理,跳过: {}", msgId);return;}try {// 4. 处理实际业务逻辑doProcess(payload);} catch (Exception e) {// 5. 业务处理失败时,需移除已处理标记(可选)redisTemplate.opsForSet().remove(PROCESSED_MSG_KEY, msgId);throw e;}}private void doProcess(String payload) {// 业务逻辑实现log.info("处理消息: {}", payload);}
}

幂等性校验的关键要素

  1. 唯一消息 ID
    消息发送方必须生成全局唯一的 msgId
    常见实现方式:UUID、雪花算法(Snowflake)、业务主键哈希
  2. 原子性操作
    必须保证 检查存在性 和 标记已处理 是原子操作
    推荐使用 Redis 的 Lua 脚本或 SADD 命令(返回值可判断是否新增)
  3. 过期时间设置
    避免集合无限增长,占用过多内存
    过期时间应大于消息可能的最大重试时间窗口(如 7 天)
  4. 异常处理
    业务处理失败时,是否需要回滚已处理标记?
    若选择回滚,需保证失败时原子性移除标记
    若不回滚,可能导致消息永久不被处理(需结合死信队列)
http://www.lryc.cn/news/575981.html

相关文章:

  • 微信小程序进度条progress支持渐变色
  • 【vue3】打包配置webpack压缩,哈希值设置
  • CVE-2015-5531源码分析与漏洞复现(Elasticsearch目录遍历漏洞)
  • 高斯混合模型GMMK均值(十三-1)——K均值是高斯混合模型的特例
  • macOS,切换 space 失效,向右切换space(move right a space) 失效
  • [论文阅读] 人工智能 | 真实场景下 RAG 系统的工程实践指南
  • JUC:7线程的五种状态与六种状态
  • AI歌手Yuri出道:GenAI,透露着新的AI产业机遇?
  • 增加寒武纪MLU270视频转码
  • 大数据赋能智能家居:打造你贴心的“数字管家”
  • STM32安全固件升级:使用自定义 bootloader 实现SD卡固件升级,包含固件加密
  • 【stm32】HAL库开发——CubeMX配置串口通讯(中断方式)
  • virtual box 配置ubuntu 22.04网络与SSH服务
  • A模块 系统与网络安全 第三门课 网络通信原理-2
  • 24CJ87-4:圆拱型采光排烟天窗
  • Pytorch基础函数速查
  • A Machine Learning Approach for Non-blind Image Deconvolution论文阅读
  • AI助力基因数据分析:用Python玩转生命密码的秘密
  • 高标准+安全可控:关键领域研发选择什么软件?
  • QT编译wasm报错:The program “mingw32-make.exe“ does not exist or is not executable
  • 《二分枚举答案(配合数据结构)》题集
  • 数据透视表学习笔记
  • 如何将两个不同类性的类组合成一个json数据
  • Vue 3 计算属性的应用
  • Valkey与Redis评估对比:开源替代方案的技术演进
  • 基于Odoo 18的生产报工系统架构与开发
  • 利用云雾自动化在智能无人水面航行器中实现自主碰撞检测和分类
  • 不同信创系统如何集中远程运维?贝锐向日葵提供稳定方案
  • 操作系统之文件管理(王道)
  • Day 10:Shell正则表达式终极指南:从“抓狂“到“掌控“的奇幻之旅