【浅谈电商】如何防止重复下单

简介: 首先我们要知道什么时候是下单操作。以JD为例:购物车 -> 结算页面 -> 下单页面- 购物车:购物车- 结算页面:此页面可以查看待支付金额,使用的优惠券,填写地址,运费等等。- 下单页面:此页面可以选择结算方式,并且页面展示付款倒计时,也就是说订单已经创建完成。在下单页面时,由于用户点击下单按钮多次、或者重试策略导致在订单服务中接收到了`两次同样`的下单请求。

【浅谈电商】如何防止重复下单

一、前言

最近正在做电商相关的项目,整理一下解决方案并帮助自己巩固知识点,此方案是结合了目前的业务环境,若有更好的解决的方式很高兴与大家一起讨论。

二、什么是重复下单

首先我们要知道什么时候是下单操作。以JD为例:

购物车 -> 结算页面 -> 下单页面

  • 购物车:购物车
  • 结算页面:此页面可以查看待支付金额,使用的优惠券,填写地址,运费等等。
  • 下单页面:此页面可以选择结算方式,并且页面展示付款倒计时,也就是说订单已经创建完成。

在下单页面时,由于用户点击下单按钮多次、或者重试策略导致在订单服务中接收到了两次同样的下单请求。

image.png

三、如何处理重复下单

重复下单场景,第二次的下单会对数据进行打乱,导致系统整体数据异常

image.png

理想的情景:

image.png

找到了问题的根本原因就可以有针对性的去解决问题。

令牌桶

面对用户的多次点击/提交/刷新页面等操作时,我们可以添加一个防重令牌的操作。每次操作前,给当前用户一个一次性的令牌,点击提交时带着令牌一起,后端会先去校验令牌的有效性,这样来避免恶意刷提交。由于令牌的有效性就好比前朝的尚方宝剑也无法斩本朝的官^_^

上述的操作在一定程度上可以解决重复提交的问题,假如当一个人的速度足够快,也是可以合理去提交一个一模一样的订单,这个时候就需要使用缓存的方式防重。

image.png

Redis

当用户下单时,去Redis中获取一个,即一个标识,同一时间只能有一个人能获取到。获取到之后才可以进行后续的逻辑,例如清除购物车、标记消费券等。若此时另外一个下单请求突破防线进入了系统,首先它需要去Redis获取锁,然而锁已经被占用了,它获取不到直接就返回失败。这里主要保证的是接口幂等性。

image.png

小结

  • 令牌桶:可以防止用户很快的提交请求,主要解决的是防重。
  • Redis:可以使同一时间只有一个下单逻辑在运行(同一用户下),主要解决的是接口幂等性。

ps:锁的含义更像一个标识,有了它你可以为所欲为,没有它什么也做不了。


目录
相关文章
|
存储 关系型数据库 MySQL
mysql数据库备份与恢复
MySQL数据库的备份与恢复是确保数据安全性和业务连续性的关键操作。
706 4
|
监控 网络协议 Nacos
Nacos:构建微服务架构的基石
Nacos:构建微服务架构的基石
938 3
|
安全 Java 应用服务中间件
Spring Boot 实现程序的优雅退出
Spring Boot 实现程序的优雅退出
|
存储 Linux Docker
在Docker中,本地的镜像文件都存放在哪里?
在Docker中,本地的镜像文件都存放在哪里?
|
JavaScript 前端开发 开发工具
如何参与开源项目以及贡献代码的流程和注意事项(2024年11月保姆级教程)
本文详细介绍了如何参与开源项目及贡献代码的流程和注意事项,包括选择项目、fork仓库、克隆到本地、阅读贡献指南、提交代码、创建Pull Request等步骤,并强调了沟通礼仪、代码质量的重要性,适合初学者参考学习。
1282 1
如何参与开源项目以及贡献代码的流程和注意事项(2024年11月保姆级教程)
|
数据采集 JSON 人工智能
Qwen2-Math开源!初步探索数学合成数据生成!
阿里通义团队开源新一代数学模型Qwen2-Math,包含1.5B、7B、72B三个参数的基础模型和指令微调模型。
单模、多模能混合使用吗?这篇给您讲明白!
单模、多模能混合使用吗?这篇给您讲明白!
909 5
|
Ubuntu Linux Windows
Linux系统盘制作(Rufus)
Linux系统盘制作(Rufus)
7904 0
|
搜索推荐 算法 Java
深入了解快速排序:原理、性能分析与 Java 实现
快速排序(Quick Sort)是一种经典的、高效的排序算法,被广泛应用于计算机科学和软件开发领域。本文将深入探讨快速排序的工作原理、步骤以及其在不同情况下的性能表现。
1139 2
深入了解快速排序:原理、性能分析与 Java 实现
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(六十七)(1)
SqlAlchemy 2.0 中文文档(六十七)
308 0