一文搞懂接口幂等性:从原理到工程实践(含唯一索引详解)
一、什么是幂等性在后端开发中幂等性Idempotency是一个非常核心的概念。定义同一个请求执行一次和执行多次结果是一样的。白话来讲我本来只想提交一次奈何用户手抖或者网络抖动让提交执行了多次 举个例子✅ 幂等操作设置用户状态 已激活执行1次已激活执行100次还是已激活 结果一致 → 幂等❌ 非幂等操作账户余额 -100执行1次扣100执行2次扣200 结果变化 → 非幂等二、为什么需要幂等性在真实系统中请求“只执行一次”是理想状态但现实往往不是常见重复请求来源用户手抖多次点击前端超时重试网关自动重试MQ消息重复投递微服务调用失败重试 如果不做幂等重复下单 ❌重复扣库存 ❌重复扣款 ❌ 核心目标保证同一笔业务只会被执行一次三、如何保证接口幂等性工程上通常采用“多层防护”的方案Redis拦截 数据库唯一索引兜底四、核心方案详解1️⃣ requestId Redis 幂等最常用思路每个业务请求携带一个唯一标识requestId后端用 Redis 判断这个请求是否处理过 关键点同一次业务操作必须使用同一个 requestId实现流程① 前端生成 requestIdrequestId UUID② 后端校验RedisStringkeyidem:requestId;BooleanokredisTemplate.opsForValue().setIfAbsent(key,1,10,TimeUnit.MINUTES);if(Boolean.FALSE.equals(ok)){thrownewBizException(重复请求);}// 执行业务createOrder();✅ 原理解释SETNXsetIfAbsent是原子操作第一次请求写入成功 → 执行业务第二次请求写入失败 → 判定重复⚠️ 注意重点 Redis key不要立即删除而是设置过期时间TTL原因防止短时间内重复请求再次进入避免“删掉后又被重复执行”2️⃣ 数据库唯一索引最终兜底Redis只是第一道防线真正保证数据不重复的是数据库。什么是唯一索引UNIQUEKEYuk_request_id(request_id) 含义request_id 这一列的值不能重复举例INSERTINTOorders(request_id)VALUES(abc123);-- ✅INSERTINTOorders(request_id)VALUES(abc123);-- ❌ 报错 本质唯一索引 索引 不允许重复3️⃣ unique 和 UNIQUE KEY 是一样的吗是的本质完全一样只是写法不同。写法1字段级usernameVARCHAR(50)UNIQUE写法2表级UNIQUEKEYuk_username(username)✅ 区别写法特点UNIQUE简单UNIQUE KEY可命名 支持多字段4️⃣ 多字段唯一很常见UNIQUEKEYuk_user_product(user_id,product_id) 表示同一个用户不能重复购买同一个商品五、Redis 数据库的组合方案完整流程第一次请求requestId abc123Redis不存在 → SETNX成功 ✅执行业务创建订单Redis保留key带TTL第二次请求重复requestId abc123Redis已存在 → SETNX失败 ❌直接拦截极端情况Redis失效两次请求都进入数据库唯一索引拦住第二次 ❌ 两层防线总结层级作用Redis快速拦截重复请求数据库唯一索引最终保证数据不重复六、SETNX 失败后怎么处理当SETNX 返回 false说明请求已处理或正在处理。常见处理方式方式1直接拒绝thrownewBizException(请勿重复提交);方式2返回已有结果更优idem:abc123 - orderId888第二次请求返回订单ID888方式3处理中状态高级idem:abc123 - processing / success七、失败场景处理如果Redis 已经 set 成功但业务执行失败解决方案方式1删除 Redis keycatch(Exceptione){redis.delete(key);}方式2记录失败状态idem:abc123 - fail允许重试八、总结面试标准答案幂等性是指同一个请求执行一次和执行多次结果一致。在接口中主要用于防止用户重复点击、网络重试等导致的重复操作。常见实现方式是通过 requestId Redis 的 SETNX 来保证请求只执行一次其中 Redis 用于快速拦截重复请求。同时在数据库层对 requestId 加唯一索引作为最终兜底防止极端情况下重复写入数据。九、一句话总结幂等性 让“重复请求”只生效一次 延伸思考进阶Redis 幂等 vs 分布式锁区别幂等 vs 事务的关系MQ 如何保证幂等消费
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2420867.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!