等性是系统可靠性与一致性的基石。 它帮助我们防止重复提交、重复消费、重复执行,为系统筑起“防二次伤害”的安全网。借助 idempotent-spring-boot-starter,我们无需手写复杂逻辑,仅凭注解即可快速为接口加上幂等保护层,让重复请求成为“无害事件”。
在高并发系统中,重复请求几乎无处不在。 用户多点几次提交按钮、客户端超时重试、消息队列重复消费——这些看似小问题,轻则造成数据冗余,重则导致订单重复、库存紊乱,甚至资金损失。
过去,我们常常手写一堆防重复逻辑,既繁琐又容易出错。 幸运的是,现在我们有了 idempotent-spring-boot-starter —— 一款即插即用的幂等性组件,让接口幂等不再是“噩梦”,而是一种优雅的日常。
幂等性是什么?
从数学概念延伸而来,幂等性(Idempotency) 指的是:
同一个操作,无论执行多少次,其结果与执行一次完全相同。
简单说:一次还是多次,都应该得到一样的业务结果。
在 Web 系统中,这意味着—— 无论接口被重复调用多少次,系统状态都不应被破坏,也不会出现额外副作用。
为什么幂等性如此重要?
让我们看看三个典型场景
表单重复提交
用户提交表单时,如果网络卡顿,往往会连点多次提交按钮。 若后端未做幂等处理,就可能插入多条相同数据,造成重复注册或重复下单。
接口超时重试
HTTP 客户端(例如 Feign、OkHttp)常会自动重试失败的请求。 若接口缺乏幂等性,可能导致多次执行同一笔支付或多次扣库存。
消息重复消费
在分布式系统中,消息队列(如 Kafka / RabbitMQ)可能因异常未确认消费,导致消息被重复投递。 如果消费者未做幂等控制,就会执行多次扣减库存或发货逻辑。
可见,幂等性是数据一致性与系统稳定性的守护者。
Spring Boot 常见幂等性实现方案
(1)数据库唯一索引
核心思路: 依靠数据库唯一约束,阻止重复数据写入。
示例:为订单表 order_no 字段添加唯一索引,重复插入会抛出异常。
适用场景:插入类操作(如订单、注册)。优点:简单、无侵入;缺点:仅限插入操作,不适用于更新或删除。
(2)Token 机制
原理: 前端先向服务端申请唯一 Token,每次请求携带该 Token。 后端校验并消费 Token,防止相同 Token 的重复请求。
流程:
- 获取 Token(存入 Redis)
- 请求携带 Token
- 服务端验证、执行业务、删除 Token
适用场景:表单防重复提交优点:通用性强,可 AOP 拦截;缺点:需要 Redis 支持,稍增复杂度。
(3)乐观锁
原理: 假设并发冲突少,每次更新携带版本号,只有版本匹配时才能更新。
适用场景:库存扣减、余额更新等。优点:性能优于悲观锁;缺点:冲突频繁时重试成本高。
(4)悲观锁
原理: 执行前加锁(如 SELECT ... FOR UPDATE),确保独占访问。
适用场景:资金转账、支付处理。优点:强一致性;缺点:性能低、易死锁。
(5)分布式锁
原理: 利用 Redis / Zookeeper 实现跨节点的互斥访问。 Redis 版一般通过 SETNX 实现。
适用场景:多节点共享资源(如分布式订单系统)。优点:可保障全局唯一执行;缺点:实现复杂、需考虑锁续租与过期。
实战篇:使用 idempotent-spring-boot-starter
我们直接在 Spring Boot 项目中集成该 Starter,让幂等实现“零成本”。
添加依赖
在 /usr/local/java/project/pom.xml 中加入以下内容:
<dependency>
<groupId>com.pig4cloud.plugin</groupId>
<artifactId>idempotent-spring-boot-starter</artifactId>
<version>0.6.0</version>
</dependency>
Redis 配置
在 /usr/local/java/project/src/main/resources/application.yml 中配置 Redis:
spring:
data:
redis:
host: 127.0.0.1
port: 6379
使用注解实现幂等
文件路径:/usr/local/java/project/src/main/java/com/icoderoad/controller/OrderController.java
package com.icoderoad.controller;
import com.raindrop.idempotent.annotation.Idempotent;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/order")
public class OrderController {
@PostMapping("/create")
@Idempotent(
key = "#order.orderNo",
expireTime = 60,
info = "订单请求已处理,请勿重复提交"
)
public String createOrder(@RequestBody Order order) {
// 模拟订单创建逻辑
return "订单创建成功";
}
}
说明:
key:唯一标识幂等请求,这里用订单号。expireTime:60 秒内相同订单号的请求视为重复。info:重复请求的提示语。
测试验证
文件路径:/usr/local/java/project/src/test/java/com/icoderoad/controller/OrderControllerTest.java
package com.icoderoad.controller;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import static org.hamcrest.Matchers.containsString;
@WebMvcTest(OrderController.class)
public class OrderControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testOrderIdempotency() throws Exception {
String orderJson = "{\"orderNo\":\"123456\",\"orderInfo\":\"测试订单\"}";
// 第一次请求
mockMvc.perform(MockMvcRequestBuilders.post("/order/create")
.contentType("application/json")
.content(orderJson))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string(containsString("订单创建成功")));
// 模拟重复请求
mockMvc.perform(MockMvcRequestBuilders.post("/order/create")
.contentType("application/json")
.content(orderJson))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string(containsString("订单请求已处理,请勿重复提交")));
}
}
使用中的优化建议
存储方式选择
- Redis 模式:适合分布式环境,性能优越。
- Memory 模式:适合单体应用或测试环境。
Key 设计原则
- 唯一性:保证每次业务请求可唯一标识。
- 稳定性:Key 应源自稳定业务字段(如订单号)。
性能优化
- 缓存本地化:结合 Redis + 本地缓存减少远程查询。
- 异步处理:对于非关键操作可异步验证,减少主线程阻塞。
- 监控与压测:定期用 JMeter 等工具进行性能测试。
总结
幂等性是系统可靠性与一致性的基石。 它帮助我们防止重复提交、重复消费、重复执行,为系统筑起“防二次伤害”的安全网。
借助 idempotent-spring-boot-starter,我们无需手写复杂逻辑,仅凭注解即可快速为接口加上幂等保护层,让重复请求成为“无害事件”。
在生产实践中,你还应根据场景选择合理的 Key 设计、存储策略及性能优化方案。
稳定系统的关键不在于避免失败,而在于即便失败,也能保持一致。
AI大模型学习福利
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获四、AI大模型商业化落地方案
因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量





被折叠的 条评论
为什么被折叠?



