一、 秒杀抢购场景下防止商品超卖的技术实现思路

1. 通常解法

方案一:

在购买下单前先查询数据库库存是否大于0进行判断,有库存在进行减库存下单操作,反之下单失败。

具体做法:用户点击活动页面时,后台进行查询数据库当中的number(库存)字段。判断number库存是否大于0,如若小于0,则给用户返回库存不足抢购失败。如若大于0,则进行下单操作,生成订单号,然后进行修改库存(number-1),判断执行操作是否成功,如若成功给用户返回抢购成功,如若失败则给用户返回抢购失败。

问 题: 当并发量大的时,数据库number字段会出现负数,所以会出现超卖问题。

方案二:

1)将库存字段number字段设为unsigned,当库存为0时,因为字段不能为负数,如果继续减库存是将会返回false

​ 2) 开启事务锁住操作的行

具体做法:

用户操作->开启事务->查询数据

->判断number是否大于0

->如若失败返回库存不足,进行事务回滚

->如若成功,进行下单操作

->修改库存number-1,进行判断

->如若更改库存失败,返回抢购失败

->如若执行成功,进行事务提交,返回抢购成功

问 题: 事务开启时,会产生一个独占锁,当并发量高的时候,就会造成有些SQL请求阻塞,从而导致并发用户出现请求超时或页面无法响应的情况,没有返回数据,只是一个空白页,所以造成用户体验不好,同时也会造成DB服务器压力非常大。

2. 通用大牛级解法

思路:通过消息队列来处理,起到高并发场景下的异步,消峰作用。

具体做法:在活动开始之前,将我们活动的商品放到我们的队列当中,开始后我们需要一个排队队列和抢购结果队列。高并发情况,先将用户插入排队队列,用一个线程循环处理从排队队列顺序取出每一个用户,判断用户是否已在抢购结果队列,如果在,则已抢购,否则未抢购,开始减库存,生成订单,支付结算等操作,同时将订单结果数据同步到MySQL。

3. 解法对比及优缺点:

常见解法,

方案一:在高并发情况下会出现库存为负数也就是超卖的问题,此方案不可取。方案二:确实解决了商品超卖的问题,但是在高并发情况下还是会给DB造成死锁和严重阻塞的情况,且用户体验比较差。

通用大牛解法:这里消息队列可以采用的消息中间件,像RabbitMQ,Kafka,ZeroMQ等等,我们样例演示采用的是redis的list数据类型实现队列,因为redis的pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用,而采用 mysql事务在高并发下性能下降很厉害,文件锁的方式虽然是非阻塞形式,但是用户体验很差。

通过对比,通过消息队列的方式可以对抢购秒送这种高并发场景下进行消峰,有效提高了系统的高可用和高性能, 大大减低数据库的读写压力,同时也提升了用户体验。

4. 延伸及扩展问题回答参考

问题:通过消息队列还有那些常见的应用场景?

解答:

1.在线竞拍,抢购等瞬间多用户高并发的场景都可以通过消息队列来消峰处理

2.在用户生成订单时也会有很多关联操作需要处理,比如:计算用户积分,计算分销商的佣金,给用户发送提醒通知,等等业务逻辑,这些是不需要在下订单那一刻马上完成执行的,所以这种情况下就可以通过消息队列的的形式,将这些非必需的业务进行解耦,异步处理,从而降低订单业务逻辑的拆分解耦,降低单个业务的复杂度。

5. 项目中体现经验的点

项目开发过程中,充分理解消息队列的应用场景,消峰,异步处理和业务解耦。在高并发的场景下可以考虑通过消息队列的进行消峰异步处理,从而适当有效降低服务器的压力,同时也可以对复杂的业务进行拆分解耦,实现了高并发情况下高性能和高可用。

6. 参考资料

RabbitMQ官方文档: https://www.rabbitmq.com/documentation.html

Redis官方文档 : https://redis.io/documentation

秒杀抢购场景下防止商品超卖的技术实现思路相关推荐

  1. 秒杀商品超卖事故:Redis分布式锁请慎用!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 来源:juejin.im/post/6854573 ...

  2. 以商品超卖为例讲解Redis分布式锁

    本案例主要讲解Redis实现分布式锁的两种实现方式:Jedis实现.Redisson实现.网上关于这方面讲解太多了,小编自认为文笔没他们好,还是用示例代码说明. 一.jedis 实现 该方案只考虑Re ...

  3. 爆火的Java面试题-以商品超卖为例讲解Redis分布式锁

    本案例主要讲解Redis实现分布式锁的两种实现方式:Jedis实现.Redisson实现.网上关于这方面讲解太多了,小编自认为文笔没他们好,还是用示例代码说明. 一.jedis 实现 该方案只考虑Re ...

  4. 避免商品超卖的4种方案

    避免商品超卖的4种方案(以下是一些核心思路) 原始方案(失败):在每次下订单前我们判断促销商品的数量够不够,不够不允许下订单,更改库存量时加上一个条件,只更改商品库存大于0的商品的库存,当时我们使用a ...

  5. CVPR 2019 | 实体零售场景下密集商品的精确探测

    作者丨孙明珊 学校丨哈尔滨工业大学(深圳) 研究方向丨目标检测 研究动机 在购物超市中,商品陈列区中摆放了密集而繁多的商品,它们大多是相同或极其相似的,并且位置十分靠近.当前主流的检测网络在这种场景下 ...

  6. 【实践】短视频场景下信息流广告的挑战和技术实践.pdf(附下载链接)

    今天给大家带来快手磁力引擎舒承椿博士所做的分享<短视频场景下信息流广告的挑战和技术实践.pdf>,关注信息流广告的伙伴们别错过了,另有志于加入快手广告部门的伙伴可以发简历至shucheng ...

  7. 秒杀商品超卖了,差点被辞退...

    「 关注"石杉的架构笔记",大厂架构经验倾囊相授 」  儒猿技术团队最新出品 <基于ShardingSphere的分库分表实战> 文章来源:[公众号:微观技术] 随着中 ...

  8. Java实现库存防超卖_高并发场景-订单库存防止超卖

    背景 在电商系统中买商品过程,先加入购物车,然后选中商品,点击结算,即会进入待支付状态,后续支付. 过程需要检验库存是否足够,保证库存不被超卖. 场景一:买家需要购买数量可以多件 场景二:秒杀活动,到 ...

  9. 抢购场景下的高并发问题的简单讲解和分析

    此文章涉及的技术点 ·SpringBoot ·Redis ·nginx https://blog.csdn.net/weixin_44012722/article/details/105466791 ...

最新文章

  1. SAP PM 初级系列20 - 维修工单的检验批
  2. 「镁客早报」人类首次在太空3D打印生物器官;中国学者研制出高性能低成本的电解“水制氢”催化剂...
  3. onclick事件执行2次
  4. 浅谈android hook技术
  5. php实现动态逐行输出
  6. 移动端网页宽度值(未加meta viewport标签)
  7. jQuery实现tab栏转换
  8. 电脑不会当局者迷——评人机围棋大战
  9. tensorflow学习笔记(2):创建自定义Estimator
  10. Flink电商指标分析项目(1)_项目整体工程搭建
  11. 台式电脑点关闭计算机关不了,台式电脑关机关不了怎么办
  12. Android开发艺术探索 第一章 Activity的生命周期和启动模式
  13. 山西票号的内部控制分析
  14. 西安市商品住房销售公示平台和价格公示
  15. mysql 5.6 不同步_MySQL5.6配置同步复制的新方法以及常见问题的解决方法
  16. 再叙AngularJS
  17. [python] 向量检索库Faiss使用指北
  18. python操作微信电脑版_PC端微信数据库解密Python版
  19. 【CAN总线】CAN总线总结
  20. 汉诺塔的递归算法与解析

热门文章

  1. dw新建html_php_asp的区别?,dw怎么新建asp
  2. 什么样的人适合创业公司?
  3. #3使用html+css+js制作网页 制作登录网页
  4. 大学英语4级该如何有效的学习?
  5. VectorDraw 10.1 专业版CAD组件-Crack
  6. Python闭包的两个案例
  7. 华控清交徐葳——参与新型数据交易所构建,实现规模化数据交易的可控可计量
  8. 太实用了!你的视频播放量低?5个小技巧教你快速提升播放量
  9. 开源云存储minio
  10. 红帽linux9.0+iso下载,Red Hat Linux 9.0 iso最新下载地址