首页/新闻资讯/正文详情

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

发布时间:2026/9/27 21:31:16 来源:云帆数科 栏目:资讯中心
接口幂等怎么做才靠谱?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

相关推荐

大模型上下文窗口完全指南:三种场景深度解析,开发者必看收藏(TaoToken 配置实战版)
大模型上下文窗口完全指南:三种场景深度解析,开发者必看收藏(TaoToken 配置实战版)

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

3招搞定wordpress采集处理样式,搞定建站报价难题
3招搞定wordpress采集处理样式,搞定建站报价难题

3招搞定wordpress采集处理样式,搞定建站报价难题 自己不会代码想做网站,却被一堆技术术语和复杂的建站报价单搞得头晕脑胀?别慌,这种纠结我太熟悉了。很多创业者盯着屏幕上的代码发呆,心里只想着怎么用最少的钱把网站搭起来,还能让它看起来专… · 2026/9/27 21:31:16

2026 企业 AI 办公工具选型指南:从方法论到平台场景匹配
2026 企业 AI 办公工具选型指南:从方法论到平台场景匹配

很多企业在首次调研AI办公工具时,会沿用过去采购传统办公自动化系统的思路:把不同产品的功能清单拉出来逐一比对,数谁内置的模板更多、支持的导出格式更全,或是单纯对比采购成本,甚至只看C端产品的公众知名度就直接采购… · 2026/9/27 21:31:09

如何制作一个网页网站:被黑挂马后,我花了3万重做
如何制作一个网页网站:被黑挂马后,我花了3万重做

如何制作一个网页网站:被黑挂马后,我花了3万重做 网站被黑挂马不知道怎么办?这是上周深夜我接到客户电话时,听到的第一句话。他的电商首页突然弹出一堆博彩广告,浏览器提示不安全,后台登录也进不去了。他问我:“这种烂摊子,彻底修好大概要多少钱?”… · 2026/9/27 22:02:30

Naise AI 核心应用场景与落地实践指南
Naise AI 核心应用场景与落地实践指南

在日常开发和产品落地过程中,我们常常面临一个核心痛点:如何让人工智能真正融入业务流,而不是仅仅作为一个聊天玩具存在?很多团队引入了大模型,却只停留在“问一个问题得到一个回答”的浅层交互上,实际的生… · 2026/9/27 22:02:30

8种常见代码编译软件配 TaoToken:从 VS Code 到 Vim 的统一 Key 配置骨架
8种常见代码编译软件配 TaoToken:从 VS Code 到 Vim 的统一 Key 配置骨架

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

DLMS/COSEM 蓝皮书解读(六):Register activation 类(class_id = 6)—— 费率切换的“总开关“
DLMS/COSEM 蓝皮书解读(六):Register activation 类(class_id = 6)—— 费率切换的“总开关“

DLMS/COSEM 蓝皮书解读(六):Register activation 类(class_id 6)—— 费率切换的"总开关"系列说明:本系列基于 DLMS UA《Blue Book(蓝皮书)第 16 版 第 2 部分》&#x… · 2026/9/27 22:02:30

客户问“你们接大模型了吗”,我该怎么答:TaoToken 统一 Key 接入 AI 工具配置指南
客户问“你们接大模型了吗”,我该怎么答:TaoToken 统一 Key 接入 AI 工具配置指南

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

网站备案核验单怎么选避坑指南图解步骤详解
网站备案核验单怎么选避坑指南图解步骤详解

网站备案核验单怎么选避坑指南图解步骤详解 找建站公司最怕什么?怕被坑高价,怕最后交付的东西连个正经备案都下不来。很多老板以为花钱买个网站就完事了,结果卡在“网站备案核验单”这一步,因为不懂行,被销售忽悠着填错信息、选错服务,导致备案被驳回甚… · 2026/9/27 22:02:23

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码