Spring Boot 3.x 优雅实现接口幂等:4 种方案一次讲透
引言 上个月运营做了一场大促预售,活动开始 10 分钟后客服反馈开始堆积:同一个用户下了两单。查日志发现不是并发 bug,也不是库存逻辑问题——用户在网络卡顿时连点了两次提交按钮,第一次请求 300ms 才返回,第二次请求几乎是同时到达的。前端虽然有按钮置灰,但置灰逻辑在“请求发出后”才生效,两道请求都穿了过去。 这类问题防得住吗?防得住,而且手段成熟——接口幂等。但幂等实现恰恰是“看起来简单、做对很难”的典型:网上随手搜到的 Redis SETNX 三行代码,放进真实系统里至少有四个坑等着你(并发窗口、异常回滚、过期时间、重复提交的用户体验)。 这篇文章用那次事故开题,把四种幂等方案一次讲透:唯一索引、Redis SETNX、Token 机制、乐观锁。每种给完整可跑的 Spring Boot 3.x 代码、适用场景、防坑要点——最后给一张选型决策表,照着抄就行。 一、为什么需要幂等:不只是双击 1.1 重复请求的四个来源 双击只是冰山一角。生产系统里重复请求的来源比想象中多: 来源场景特点 用户行为双击提交、刷新重发、返回键重放单用户、低频、难彻底在前端防住 网络重试HTT....