【场景题】如何防止重复下单
【场景题】如何防止重复下单1. 如何防止重复下单2. ✅ 方案一数据库唯一索引3. ✅ 方案二前端防抖只是辅助4. ✅ 方案三Token 防重复提交常见4. ✅ 方案四订单状态机控制核心5. ✅ 方案五分布式锁高并发场景6. 真正生产级推荐组合方案7. 不同业务推荐方案1. 如何防止重复下单当网络出现了阻塞用户不断点击下单按钮出现了重复下单应该如何去防止呢?普通的下单流程首先会由用户发起一个下单操作然后会由订单服务去保存一条订单信息此时订单的状态是【未支付】然后再由用户去确认订单。由支付服务把当前这条订单修改为【待支付】然后再跳转到支付界面接着由用户去选择对应的支付方式来进行钱包支付。支付完成之后呢由支付平台进行回调回调到支付服务再去调用订单服务修改状态为【已支付】。哪一步会出现重复操作而出现幂等性操作呢只有在用户下单的哪一步会出现这个问题2. ✅ 方案一数据库唯一索引适用场景同一个用户 同一个业务条件 只能有一个订单例如UNIQUEKEYuk_user_product(user_id,product_id,biz_type)或者UNIQUEKEYuk_order_no(order_no)Java 代码try{orderMapper.insert(order);}catch(DuplicateKeyExceptione){// 已存在订单直接查询返回returnorderMapper.selectByBizKey(...);}✅ 优点简单绝对可靠不怕并发❗注意一定要以数据库为最终裁决者。3. ✅ 方案二前端防抖只是辅助提交后按钮 disabledloading防抖 1~2 秒但这只是体验优化不是安全方案。4. ✅ 方案三Token 防重复提交常见流程用户进入下单页服务端生成一个 UUID token存 Redis有效期 5 分钟下单时必须携带该 token使用 Lua 脚本原子校验并删除Redis Luaifredis.call(get,KEYS[1])ARGV[1]thenreturnredis.call(del,KEYS[1])elsereturn0endJava 逻辑如果返回 1 → 允许下单如果返回 0 → 重复请求✅ 优点抗前端重复点击抗接口重试❗缺点不能防止真正的并发写库冲突还是要配合数据库唯一索引优雅的使用Redission来解决问题先说清楚Token 防重复提交在干嘛同一个页面在短时间内用户重复点“提交”按钮。流程本质是① 页面加载 → 后端生成一个 token ② token 存 Redis设置过期时间 ③ 用户提交时必须带这个 token ④ 后端校验 token 是否存在 ⑤ 校验成功 → 删除 token → 继续执行 ⑥ 再次提交 → token 不存在 → 拒绝核心点token 必须“校验 删除”原子执行 否则会并发通过。标准 Redisson 实现第一步生成 tokenGetMapping(/order/token)publicStringgenerateToken(){StringtokenUUID.randomUUID().toString();RBucketStringbucketredissonClient.getBucket(order:token:token);bucket.set(1,5,TimeUnit.MINUTES);returntoken;}第二步下单时校验 token⚠️ 关键点必须原子删除Redisson 有一个非常好用的方法// 这是原子的bucket.getAndDelete()最终代码PostMapping(/order)publicStringcreateOrder(RequestParamStringtoken){RBucketStringbucketredissonClient.getBucket(order:token:token);Stringvaluebucket.getAndDelete();// 原子操作if(valuenull){thrownewRuntimeException(请勿重复提交);}// 执行业务逻辑return下单成功;}为什么 getAndDelete 是安全的Redis内部执行 GET key DEL key 但在Redisson中是用Lua保证原子执行的。 所以 第一次请求 → 拿到值 → 删除成功 第二次请求 → key 已不存在 → 返回null不会出现并发穿透。4. ✅ 方案四订单状态机控制核心订单必须有明确状态INIT → PAYING → PAID → CANCELLED创建订单前select*from order where user_id?and product_id?and status in(INIT,PAYING)存在则直接返回已有订单。这是业务级幂等。5. ✅ 方案五分布式锁高并发场景RLocklockredisson.getLock(order:userId);lock.lock();try{// 查询是否已有订单// 创建订单}finally{lock.unlock();}适用场景秒杀抢购打车平台库存扣减❗但要注意锁粒度不要锁全局6. 真正生产级推荐组合方案前端防抖(置灰) Token 防重复 数据库唯一索引 订单状态机控制7. 不同业务推荐方案场景推荐方案普通下单唯一索引 状态机秒杀Redis Lua 唯一索引支付回调幂等号 唯一索引打车平台用户锁 状态机MQ 消费幂等表记录 message_id

相关新闻

Day28—反射动态代理

Day28—反射动态代理

反射反射的概述反射允许对成员变量,成员方法和构造方法的信息进行编程访问获取class对象三种方式①Class.forName(“全类名”);②类名.class③对象.getClass();获取构造方法规则:​ …

2026/7/7 3:09:09 阅读更多 →
【CVPR26-陈志波-中国科学技术大学】混合智能体用于图像恢复

【CVPR26-陈志波-中国科学技术大学】混合智能体用于图像恢复

文章: Hybrid Agents for Image RestorationCode: 暂无单位:中国科学技术大学一、问题背景图像恢复(Image Restoration, IR)一直是低级计算机视觉中的热门研究话题,旨在将低质量的输入图像恢复为高质量的输出。然而&am…

2026/7/6 22:29:45 阅读更多 →
一份完整的阿里云 Redis 开发规范

一份完整的阿里云 Redis 开发规范

1. 引言阿里云 Redis(ApsaraDB for Redis)是一款兼容开源 Redis 协议的高性能 Key-Value 数据库,提供缓存、持久化、弹性扩缩容、备份恢复、容灾等多种能力。随着业务的发展,Redis 的使用场景越来越广泛,但若缺乏规范指…

2026/7/3 16:41:22 阅读更多 →

最新新闻

GitHub Copilot按token收费:开发者算力素养实战指南

GitHub Copilot按token收费:开发者算力素养实战指南

1. 项目概述:一场被误读的定价调整,而非黄金时代的终结 “GitHub Copilot 改‘按 token 收费’:开发者的黄金时代结束了?”——这个标题一出来,我刷到时手里的咖啡差点洒在键盘上。不是因为震惊,而是因为太…

2026/7/8 19:07:59 阅读更多 →
Copilot工程实践:上下文窗口、Plan Agent与TDD协同方法论

Copilot工程实践:上下文窗口、Plan Agent与TDD协同方法论

1. 项目概述:一个倒计时应用,如何成为检验大模型工程能力的“压力测试仪” 我最近用 GitHub Copilot 从零开始写了一个功能完整的倒计时应用——不是那种只在控制台打印“3、2、1”的玩具代码,而是带图形界面、支持多任务并行、可暂停/继续、…

2026/7/8 19:07:59 阅读更多 →
3分钟掌握Windows窗口强制调整:告别无法缩放的应用窗口

3分钟掌握Windows窗口强制调整:告别无法缩放的应用窗口

3分钟掌握Windows窗口强制调整:告别无法缩放的应用窗口 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些顽固的Windows应用窗口而烦恼吗?有些程序…

2026/7/8 19:01:54 阅读更多 →
10种常见作物叶片病害YOLO检测数据包:含划分好的训练验证集、类别说明和标注可视化工具

10种常见作物叶片病害YOLO检测数据包:含划分好的训练验证集、类别说明和标注可视化工具

本文还有配套的精品资源,点击获取 简介:这个数据包专为农业病害目标检测模型训练准备,覆盖水稻、玉米、小麦等作物的10类典型叶片病害,包括格鲁病、早叶斑病、黑斑病等。所有图像统一处理为416416 RGB格式,标注严格…

2026/7/8 19:01:54 阅读更多 →
Java在AI应用中的工程化实战:RAG与Agent生产落地指南

Java在AI应用中的工程化实战:RAG与Agent生产落地指南

1. 开篇——AI应用时代,Java还能打吗?这个问题我去年在三个不同城市的Java技术沙龙上都被问过,每次提问的都不是刚毕业的学生,而是工作5年以上的后端工程师,有人已经带团队做Spring Cloud微服务三年,有人正…

2026/7/8 18:57:53 阅读更多 →
落地型中医AI智能体与纯理论LLM方案对比研究——基于两篇CSDN技术博文的实证辨析

落地型中医AI智能体与纯理论LLM方案对比研究——基于两篇CSDN技术博文的实证辨析

摘要 在中医药数字化转型浪潮下,AI中医智能体形成工程落地路线与纯理论算法路线两条发展分支,大量LLM中医方案仅停留在算法框架设计,缺失临床硬件、医疗合规、真实场景验证,陷入“纸上谈兵”困境。本文选取两篇代表性CSDN技术文献…

2026/7/8 18:53:50 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻