当前位置: 首页 > 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.lqws.cn/news/541675.html

相关文章:

  • fishbot随身系统安装nvidia显卡驱动
  • Rust交互式编程环境Jupyter Lab搭建
  • 【unitrix】 4.10 数字类型的按位异或运算实现(bitxor.rs)
  • 同样是synthesis(综合) HLS和Vivado里面是有什么区别
  • 【git学习】学习目标及课程安排
  • Java 大视界 -- Java 大数据在智能教育学习社群知识共享与协同学习促进中的应用(326)
  • 【HTML】
  • 中国科技术语杂志中国科技术语杂志社中国科技术语编辑部2025年第3期目录
  • 算法第55天|冗余连接、冗余连接II
  • C++ 第三阶段 并发与异步 - 第二节:异步任务(std::async)
  • 在docker容器中安装docker服务,基于fuse-overlayfs进行overlay挂载,而不是vfs
  • HarmonyOS NEXT仓颉开发语言实现画板案例
  • MySQL 离线安装MariaDB
  • SYSCFG 时钟在 GD32F4 系列微控制器中的作用
  • Layer by Layer: Uncovering Hidden Representations in Language Models
  • 当前最好的0样本文本转语音是哪个模型?
  • SpringCloud系列(38)--SpringCloud Gateway实现动态路由
  • 2024百度之星:BD202404 110串
  • JDY-23蓝牙模块与电脑的连接方式
  • 从0开始学习计算机视觉--Day04--损失函数
  • 杭州西湖断桥不断:3D扫描还原‘残雪‘视觉骗局
  • 在反向代理环境下精准获取客户端真实 IP 的最佳实践
  • Linux journal 日志大小限制与管理详解
  • vue-27(实践练习:将现有组件重构为使用组合式 API)
  • 七天学会SpringCloud分布式微服务——04——Nacos配置中心
  • 便携式水质检测仪的功能
  • 基于 SpringBoot+Vue 的台球厅管理系统的设计与实现(毕业论文)
  • [ linux-系统 ] 磁盘与文件系统
  • 排查 WebView 中 touch、click 事件失效:移动端调试过程详解
  • PIXHAWK(ardupilot4.52)NMEA的解析bug