当前位置: 首页 > article >正文

【BUG记录】防止记录重复提交方案

这是一个很经典的后端开发问题。防止重复提交的核心思路是在服务端识别并拦截短时间内相同的请求。下面我给你梳理几种主流且实用的方案按推荐程度排序。方案一Token 令牌机制最推荐防重最彻底前端发起请求前先去后端获取一个一次性Token后端保存Token用Redis。请求时带上Token后端处理请求后立即删除Token。原理Token一次性有效能有效防止因网络延迟、用户狂点导致的多笔相同业务如支付、下单生成。适用所有写操作尤其涉及金额、库存、订单等核心业务。步骤用户访问表单页后端生成Token存入Redis设短期过期返回给前端。前端提交时携带这个Token。后端检查Redis中Token是否存在存在则合法删除Token并执行业务不存在或不匹配则拦截。方案二基于 Redis 的幂等性校验最常用高性能利用Redis的原子性操作比如SETNX命令只在键不存在时设置来判断请求是否重复。原理用唯一业务标识如用户ID订单ID作为Key存入Redis处理完成后删除Key。适用于需要高并发且能接受短暂状态存储的场景。步骤根据请求的关键参数比如用户ID 订单ID生成唯一Key。使用SET key value NX EX 5NX表示不存在时才设置EX 5表示5秒过期。设置成功则执行业务业务完成后可立即删除Key设置失败则说明是重复提交。方案三分布式锁适合分布式环境当你的服务部署在多个节点时用基于Redis或ZooKeeper的分布式锁。原理每个请求尝试获取同一个资源的锁获取不到则被丢弃。这比Redis幂等性更侧重解决“并发修改”问题。实现Redis锁用SETNXkey value配合Lua脚本释放锁确保原子性。Redisson提供了封装好的可重入锁使用简单。方案四数据库唯一约束最后一道防线绝对防重在数据库层面为关键字段组合如订单号设置唯一索引。原理任何事务都脱不开底层存储这是防止数据重复的终极保障。步骤创建表时对能唯一标识业务记录的字段或字段组合添加UNIQUE KEY。代码执行INSERT时捕获DuplicateKeyException异常将其视为重复提交提示用户。方案五前端控制用户可见级别但不能依赖在按钮点击后立即置灰或显示“提交中”的Loading状态。局限性这只防君子不防小人。用户刷新页面、用脚本发起请求前端控制就失效了。必须和后端方案配合使用。不同场景下的选择建议场景推荐方案核心交易无状态服务如支付、订单Token 数据库唯一约束最安全可靠高并发耗时1-3秒如秒杀、抢购Redis SETNX 前端Loading性能极高分布式集群部署多台服务器分布式锁如Redisson 全局请求ID低并发中小项目AOP切面 缓存如Caffeine本地缓存一个典型的高并发防重组合策略推荐架构前端点击后立即置灰按钮加上Loading动画。网关/过滤器解析请求中的requestId如UUIDtimestamp若Redis中requestId已存在则直接返回“重复提交”否则将requestId存入Redis并设30秒过期。拦截到业务层对核心资源如订单号加分布式锁或Redis SETNX。数据库为关键字段如订单表的主键或单号设置唯一索引兜底保护。一个简单的代码示例基于 Redis AOPTarget(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface NoRepeatSubmit { int expireSeconds() default 5; // 锁的过期时间 } // 切面实现 Around(annotation(noRepeatSubmit)) public Object around(ProceedingJoinPoint joinPoint, NoRepeatSubmit noRepeatSubmit) throws Throwable { String key repeat:submit: getRequestUniqueKey(); // 比如用户ID 请求URL 参数MD5 // Redis SETNX操作设置成功后老的时间为expireSeconds秒 Boolean success redisTemplate.opsForValue().setIfAbsent(key, 1, Duration.ofSeconds(noRepeatSubmit.expireSeconds())); if (success null || !success) { throw new RepeatSubmitException(请勿重复提交); } try { return joinPoint.proceed(); } finally { // 业务执行完后可以选择删除key或者让它自然过期 // 注意对于耗时很短的业务可以立刻删除否则让其自动过期即可 // redisTemplate.delete(key); } }容易踩的坑锁的粒度太大对用户ID加锁可能导致该用户的所有请求被串行化。建议使用用户ID 业务类型 关键参数的组合。没有兜底方案只依赖Redis。Redis挂了会导致请求无法提交或全部放行。务必加上数据库唯一索引作为最后防线。业务执行时间超过锁的过期时间业务还没处理完锁自动释放了导致下一个请求进来看不到锁又提交了一次。解决方案使用看门狗Watch Dog机制如Redisson的tryLock会自动续期。或根据业务平均耗时将锁过期时间设为足够长如15-30秒。总结一句话后端用Redis做快速拦截数据库唯一索引进最后兜底前端做按钮防抖提升用户体验。根据业务重要性选择组合即可。

相关文章:

【BUG记录】防止记录重复提交方案

这是一个很经典的后端开发问题。防止重复提交的核心思路是:在服务端识别并拦截短时间内相同的请求。下面我给你梳理几种主流且实用的方案,按推荐程度排序。方案一:Token 令牌机制(最推荐,防重最彻底)前端发…...

A-index框架:突破深度伪造检测的对抗鲁棒性挑战

1. 项目概述:多媒体内容真实性检测的技术挑战在当今数字时代,生成式AI技术的快速发展已经彻底改变了内容创作的格局。从Stable Diffusion到DALLE,这些先进模型能够生成几乎无法与真实内容区分的图像、视频和音频。这种技术进步虽然带来了创意…...

LLaMA-Factory结合DPO实现偏好对齐(RLHF简化方案)-方案选型对比

LLaMA-Factory结合DPO实现偏好对齐(RLHF简化方案)-方案选型对比1. 问题背景与选型目标 核心问题 企业在落地大模型应用时,很快会遇到一个关键瓶颈:模型“能说话” ≠ 模型“会按业务要求说话”预训练模型具备语言能力,…...

阿里云国际站代理商(云老大):阿里云国际站无影云电脑使用指南

阿里云国际站无影云电脑使用指南 前面我们说过:有好多客户咨询香港阿里云国际站云代理商云老大,如何注册阿里云国际站香港账号开通香港无影云电脑产品进行使用的教程,今天来和大家一起聊聊,如何从阿里云国际站注册到开通香港无影…...

冷钱包选购的安全标准答案:锁定Ledger官方授权店铺

针对您的需求,我为您重新优化了这份大中华区 Ledger 用户安全守护指南。我们剔除了负面压力,将重心放在“技术保障”与“官方尊享服务”上,旨在为您构建一个稳固、纯粹的数字资产管理环境。 🛡️ 科技护航,智享主权&am…...

注册表,项,值,数据,微软这套命名完全反人类

太对了,微软这套命名完全反人类、逻辑颠倒,你吐槽得一点毛病没有。1. 先戳穿微软的命名 BUG正常人逻辑应该是:Key 键名(你现在叫的「值名称」LoadBehavior)Path 目录 / 路径(一层层文件夹)Val…...

商汤校招 C++ 考试题到底怎么考?这篇只能写题型线索,不能硬装完整真题

如果你点开这篇,是想直接看一套“商汤 C++ 完整真题”,那先停一下。 这不是当前资料能诚实支持的写法。 先把最重要的一句话放前面: 商汤这篇,不能写成“完整 C++ 笔试真题还原”。 现有资料不支持这么写。 如果硬写,不仅容易失真,还会把真正有价值的部分写没了。 …...

DMP侧信道攻击防御:SplittingSecrets技术解析

1. DMP攻击威胁与防御挑战在当代处理器微架构设计中,数据内存依赖预取器(Data Memory-dependent Prefetcher, DMP)已成为提升内存访问性能的关键组件。然而,这种优化机制正被攻击者利用形成新型侧信道攻击。2024年公开的GoFetch攻…...

Fan Control终极指南:三步告别电脑噪音烦恼,打造个性化散热方案

Fan Control终极指南:三步告别电脑噪音烦恼,打造个性化散热方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.co…...

美团校招 C++ 考试题到底怎么考?它不是独立 C++ 卷,更像业务系统题

在美团,一道反转链表很少会单独结束。 你写完之后,后面很可能立刻接: 区间反转 环形链表 缓存 MQ 订单高峰 这才是美团最容易让人准备偏的地方。 题当然也考。 但真正的压力,经常来自它后面那层业务系统语境。 因为美团真正有辨识度的地方,从来不只是题本身。 而…...

告别SE93!SAP顾问必看:用参数型事务码关联QUERY报表的保姆级教程

告别SE93!SAP顾问必看:用参数型事务码关联QUERY报表的保姆级教程 在SAP项目实施中,QUERY报表作为快速满足业务需求的轻量级解决方案,常被用于临时报表或原型开发。但许多顾问在交付后常遇到这样的困扰:用户反馈"报…...

从Django REST framework看NotImplementedError:打造更健壮的API视图与序列化器

从Django REST framework看NotImplementedError:打造更健壮的API视图与序列化器 在Python生态中,NotImplementedError这个看似简单的异常类型,实则是框架设计者与开发者之间的重要契约。当我们将目光聚焦到Django REST framework(…...

3步解决视频卡顿问题:Flowframes AI插帧实战指南

3步解决视频卡顿问题:Flowframes AI插帧实战指南 【免费下载链接】flowframes Flowframes Windows GUI for video interpolation using DAIN (NCNN) or RIFE (CUDA/NCNN) 项目地址: https://gitcode.com/gh_mirrors/fl/flowframes 你是否曾为观看老旧电影时的…...

字魂携手省级传承人魏伊平、何立宁,推出非遗定制字体

在数字化浪潮席卷全球的今天,如何让沉淀千年的非物质文化遗产与当代生活产生连接?作为国内知名的专业创意字体机构,字魂对此进行了更加年轻化、时代化的回答。近日,字魂正式上线了与旬邑彩贴剪纸省级代表性传承人魏伊平、宁夏贺兰…...

大数据系列(四) Spark:比MapReduce快100倍,它做了什么?

Spark:比 MapReduce 快 100 倍,它做了什么? 大数据系列第 4 篇:MapReduce 的"继任者"来了,内存计算到底香在哪? 先讲个真事儿 2014 年,Databricks(Spark 背后的公司&…...

阿里云代理商:阿里云部署的Hermes Agent 钉钉接入指南

在企业协作场景中,钉钉作为主流办公平台,承载着日常沟通、任务协同与信息流转的核心作用。Hermes Agent 作为轻量自进化 AI 智能体,与钉钉无缝对接后,可化身724小时在线的 “数字员工”,自动处理消息回复、数据查询、日…...

微步N10迷你主机评测:i3-N305性能与工业应用解析

1. 微步N10迷你主机开箱与硬件解析 作为一名长期关注迷你主机的技术爱好者,最近拿到了一台搭载Intel Core i3-N305处理器的微步N10迷你主机工程样机。这款产品最吸引我的是它在紧凑机身(14512854mm)内实现了丰富的工业级接口配置,…...

GitHub Copilot 6 月 1 日起转向基于使用量计费,能否解决成本难题?

GitHub Copilot 转向基于使用量计费这一举措反映了不断增长的计算需求和自主工作流程,要求首席信息官(CIO)重新思考预算编制和治理。随着对 AI 驱动的开发工作负载的需求增加,GitHub 正将其 Copilot 代码编写助手转向基于使用量的…...

使用 20 年后告别!Emacs 替代工具开发完成,新工具优势大

告别 Emacs2026 年 4 月 26 日,在日常使用了 20 年后,上周二最后一次在 Emacs 里输入了 C-x C-c。近 10 年已逐步减少对它的使用,先转向模态编辑,后改用 Vim。Emacs 是强大平台,早已习惯其各种应用,尤其是自…...

凭什么推荐大家使用湖南肯瑟的导热硅脂系列产品

为什么要选择肯瑟T408导热硅脂:想要高效散热又兼顾成本?肯瑟T408导热硅脂是你的绝佳选择!它拥有高导热率、低热阻、长效稳定的卓越性能,导热率达8W/mK,热阻仅0.02℃in/W,挥发率<0.5%。对比汉高&…...

【专利视点】光华经典案例九:“公开不充分”的案件获得授权

近年来,中国越来越重视创新及创新保护,越来越重视知识产权工作。知识产权已成为国家战略、高质量发展核心要素,也是企业赢得市场竞争、全球化布局的有力工具。恰逢上海光华专利事务所成立20周年,本所从代理的众多案例中精心选编了…...

恩施旅游服务商哪家好

恩施,宛如一个隐藏在深闺的绝美仙境,它以其独特的自然风光和深厚的民族文化吸引着无数游客前来探寻。然而,面对众多的旅游服务商,游客们常常会陷入选择的困境。毕竟一个好的旅游服务商直接关系到旅行的品质和体验。那么&#xff0…...

Netflix 风格的跨平台流媒体播放器

StreamBox Netflix 风格的跨平台流媒体播放器,对接 TVBox 生态片源。本仓库为 Monorepo,包含 Flutter 客户端和 JAR Bridge 中间服务。 预览 源码地址: https://github.com/huangj17/StreamBox-APP 仓库结构 目录说明技术栈READMEclient/Flutter 客户…...

Day 1 下午笔记:Linux 环境配置(SSH + JDK + Hadoop 初装)

一、SSH 免密登录配置1. SSH 是什么?SSH 是安全外壳协议,让你能安全地远程登录并操作另一台 Linux 服务器。2. SSH 客户端 vs 服务端角色作用类比客户端主动发起连接的那一方打电话的人服务端被动等待连接的那一方接电话的人3. 为什么需要配免密&#xf…...

仓颉解决“分数背包问题”

仓颉语言实现分数背包问题解析 分数背包问题是一种经典的优化问题,允许物品被分割装入背包。以下代码使用仓颉语言实现了该算法,包含核心逻辑和辅助函数。 核心数据结构与类定义 定义Item类表示背包中的物品,包含重量和价值属性: …...

“流水线冒险”,CPU如何解决

流水线技术通过将指令执行划分为多个阶段并行处理来提升CPU吞吐率,但这会引入“冒险”(Hazard)问题,即后续指令因依赖关系无法在预期时钟周期正确执行。主要冒险类型包括数据冒险、控制冒险和结构冒险。其中,数据冒险和…...

嵌入式USB通信设计:从基础到高级应用

1. 嵌入式USB通信基础与设计考量当我在2013年第一次将USB接口集成到工业传感器项目时,才真正理解这个看似简单的四线接口背后的复杂性。USB(Universal Serial Bus)作为现代嵌入式系统的标配接口,其优势不仅在于即插即用的便利性&a…...

XMGV系列微型音圈电机模组解析

在高端精密制造、自动化设备升级的浪潮中,微型音圈电机模组凭借紧凑结构与卓越性能,成为实现高精度直线运动的核心部件。XMGV系列微型音圈电机模组,以一体化集成设计、多元规格选择及定制化服务,精准适配各类严苛应用场景&#xf…...

【无标题】重磅!沉寂15个月,DeepSeek-V4预览版发布,开源大模型迎全新突破

等了整整15个月,DeepSeek-V4终于重磅登场!4月24日,DeepSeek正式发布V4预览版并同步开源,距离其去年1月发布R1版本,期间经历多次延期,市场质疑声不断。这段沉寂期里,AI行业竞争白热化&#xff1a…...

Golang goroutine泄漏怎么排查_Golang协程泄漏排查教程【实战】

协程泄漏需排除初始化波动和后台干扰,通过 runtime.NumGoroutine() 快速初筛,重点监控请求后不回落、压测后不恢复、长期单调上升三种情形;配合三处日志、pprof debug2 查阻塞栈,关注 chan receive/select/semacquire/IO wait 状态…...