新闻详情

新闻详情

首页 / 资讯中心 / 详情

接口幂等怎么做才靠谱?Redis token + 数据库唯一键,我两层都上了

发布时间:2026/9/27 21:31:11来源:尧图网络
接口幂等怎么做才靠谱?Redis token + 数据库唯一键,我两层都上了
接口幂等怎么做才靠谱Redis token 数据库唯一键我两层都上了导读求职招聘系统里“重复提交是个高频事故源用户手抖点了两次投递简历”前端没拦住后端就插了两条投递记录重试机制误触发发布职位变成发布两次。接口幂等是后端必须扛住的活不能指望前端。这篇讲我在 qkl-boot 里落地的两层幂等方案。第一层Redis token 机制防正常重复提交思路是一单一令前端在提交前先向后端要一个 token提交时带上这个 token后端只认第一次用掉它的请求。RestControllerRequestMapping(/common)publicclassIdempotentController{AutowiredprivateStringRedisTemplateredis;/** 前端提交前先拿一个幂等令牌 */GetMapping(/idempotent-token)publicResultgetToken(){StringtokenUUID.randomUUID().toString();redis.opsForValue().set(idem:token,1,Duration.ofMinutes(10));returnResult.ok(token);}}关键在校验 删除必须原子——用 Redis 的 delete 判断返回值// 幂等校验切面简化版publicvoidcheckToken(Stringtoken){// delete 返回 1 说明 token 存在且被删除第一次返回 0 说明已被用过或不存在Booleanokredis.delete(idem:token);if(!Boolean.TRUE.equals(ok)){thrownewBizException(重复提交请勿频繁操作);}}delete本身是原子的多个请求同时来只有一个能删成功其余全部被拦。这是 token 方案的核心——校验和消费必须是一步。第二层数据库唯一键兜底防极端并发穿透Redis 方案在单实例下够用但极端并发下如果 Redis 短暂不可用或者 token 校验和业务执行之间出了问题还是可能穿透。真正的兜底是数据库层的唯一约束。以投递简历为例给投递记录表加唯一索引ALTERTABLEjob_deliveryADDUNIQUEKEYuk_user_job(user_id,job_id);业务层捕获唯一键冲突ServicepublicclassDeliveryService{publicvoiddeliver(LonguserId,LongjobId,StringidemToken){// 第一层Redis token 校验切面已做try{deliveryMapper.insert(userId,jobId);}catch(DuplicateKeyExceptione){// 第二层数据库唯一键兜底重复投递直接返回成功已存在log.info(重复投递已拦截: user{} job{},userId,jobId);return;}}}两层都上之后前端正常防抖走 token极端穿透由数据库唯一键接住重复数据从根上就插不进去。踩坑token 校验和业务执行不是原子的现象压测投递接口200 并发下出现几条重复投递记录。明明 token 校验用 delete 是原子的怎么会穿透排查看代码发现——token 校验在一个切面里Around前置校验 删除业务方法在切面之后执行。但业务方法内部又调了远程服务简历解析耗时较长token 在切面里已经被删了业务还没执行完。此时如果前端超时重试会重新拿新 token 再提交——新 token 校验当然通过业务又执行了一遍。定位问题不在 token 机制本身在超时重试的语义前端把接口超时误判为接口失败重新走了一遍完整流程拿新 token 提交。token 防的是同一 token 重复提交防不了重试后拿新 token 再提交。解决两层一起用。token 保证单次请求不被重复执行数据库唯一键保证同一个业务动作用户职位无论来几次都只有一条记录。后者才是业务幂等的真兜底。压测验证200 并发下数据库记录数精确等于岗位数零重复。可直接复用的清单token 的校验 删除必须原子用redis.delete()返回值判断别先 get 再 del唯一键冲突用DuplicateKeyException捕获重复操作按成功返回幂等语义token 设置过期时间10 分钟够了防止 token 堆积幂等 token 适合防重复提交业务幂等同人同动作靠数据库唯一键涉及远程调用的接口token 超时重试语义要想清楚别把超时当失败这套两层方案在 qkl-boot 里跑了大半年投递、发布、报名这些高频写接口全走它没再出过重复数据。核心一句话Redis 管单次数据库管业务谁也别指望单靠一层。项目源码https://gitee.com/gzqkl/qkl-boot
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

菏泽网站建设电话咨询避坑指南:5000到5万到底差在哪 2026/9/27 22:26:56

菏泽网站建设电话咨询避坑指南:5000到5万到底差在哪

菏泽网站建设电话咨询避坑指南:5000到5万到底差在哪 模板网站看着像那么回事,一上线客户就骂娘,这钱花得冤不冤? 很多老板在菏泽找建站公司,第一句话往往是“做个官网”,第二句话就问“多少钱”。…

阅读更多 →
3个免费工具搞定wordpress花钱吗难题 2026/9/27 22:26:49

3个免费工具搞定wordpress花钱吗难题

3个免费工具搞定wordpress花钱吗难题 自己不会代码想做网站,是不是觉得必须得花大价钱找外包?其实,WordPress 本身是开源免费的,真正的成本往往藏在那些你没注意到的角落。很多创业团队负责人一听到“建站”就想到预算,生怕被坑。…

阅读更多 →
Python 数据库查询:fetchone() 与 fetchall() 的区别与 TaoToken 配置实践 2026/9/27 22:26:43

Python 数据库查询:fetchone() 与 fetchall() 的区别与 TaoToken 配置实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
IIR 拖尾(ring‑down)效应解析 2026/9/27 22:26:43

IIR 拖尾(ring‑down)效应解析

测试对象:H3A‑HFV 通路单级 5 阶 IIR;11 个 S12Q6 系数 前馈: 反馈:差分方程输入 20 个同一行水平像素(已减去直流偏移,对应现实图像一条竖直竖线边缘)n: 0 1 2 3 4 5 6 7 8 9 10 11 …

阅读更多 →
网站空间到期时间查询新手入门 2026/9/27 22:26:43

网站空间到期时间查询新手入门

3步查清网站空间到期时间,告别源码下载盲区 网站突然打不开,浏览器提示“连接被拒绝”,或者页面瞬间变成一堆乱码甚至出现博彩广告,这时候你慌不慌?很多老板第一反应是网站被黑挂马了,急着找技术人员修。但十有八九,根本原因不是黑客,而是你的…

阅读更多 →
dashi-ppt-skill 配 TaoToken:浏览器内就地编辑与本地化导出 PPTX 的 AI Agent 技能配置指南 2026/9/27 22:26:43

dashi-ppt-skill 配 TaoToken:浏览器内就地编辑与本地化导出 PPTX 的 AI Agent 技能配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉