【并发】关于并发、超卖处理的思路
做电商网站,经常会有各种秒杀和热门商品,所以高并发的处理一直是电商最重要的事情。这里记录下当初自己是如何处理的
写在前面:
1、本文设计到的并发处理均是针对纵向,不针对横向扩展,即只设计从PHP层面到数据库层面的处理,不涉及多台服务器,集群、大带宽等的横向设计。
2、本文中涉及到的高并发并不是淘宝京东等几百万几千万等的高并发,仅仅只是普通最多上万的并发处理
3、本文不对悲观锁乐观锁做设计
问题:
普通电商中的秒杀中的并发问题,超卖问题
实例:商品数量为100,秒杀人数为10000,整点开始秒杀
秒杀大概流程:
①商品详情点击购买(秒杀)--》②输入信息提交订单--》③进行支付
解决思路:
1、人数阀门设计
2、会员排队设计
3、问答问题设计
4、库存缓存设计
5、页面静态设计
思路理解:
一、人数阀门设计:进行用户人群过滤。
商品数量只有100份,秒杀人数有10000人,那么我们就设计1道阀门(根据情况,可以设计3道或者2道都可以的)。
在整点的时候,我们对点击了“购买”按钮后,我们只运行500人进入信息填写页面,信息填写完成后提交订单。效果如下:
①商品详情点击购买(秒杀)--》②输入信息提交订单--》③进行支付
10000人 500人 (这里也可以设计阀门,只允许多少人进入支付)
其他未进入的如何处理乃?显示已抢完或者排队等待(这就是后面要提到的排队系统设计)。
二、会员排队设计:对用户进行排队,排在前面的先购买
这相当于是消息队列模式了,如果秒杀是立即知道结果,排队可能会有点鸡肋。
在第二步②输入信息提交订单后进行排队,排在前面的先购买,排在后面的后购买
三、问答问题设计:过滤掉一些反应慢的用户
在第一步①点击购买后跳转到问题页面,用户必须回答正确问题后,方可进入后面的流程
四、库存缓存设计:缓存库存,判断用户购买的商品是否还有,不读取数据库,速度快,也不会增加数据库负担,经过前面的过滤,超卖的可能性比较低了
提前将商品库存缓存起来,到下单购买的时候,用户购买了就减1,每次都通过库存缓存判断一下,如果为0就显示已抢完。
五、页面静态设计:尽量静态缓存化【CDN那些这里不做考虑】
第一步①商品详情页面,尽量进行缓存,减轻大批量用户在访问商品页面的时候,大量查询数据库。
问答问题页面:全静态,加载快,无数据库负担。
排队等待页面:全静态,加载快,无数据库负担。
排队结束页面:全静态,加载快,无数据库负担。
小试牛刀:
上面说了那么多废话,总归在一起,流程大概就成了下面这样:
①商品详情点击购买(秒杀) --》 ②进入问题回答页面 --》③排队等待 --》 ④输入信息提交订单 --》 ⑤进行支付
页面缓存 问题过滤 阀门过滤 缓存库存减少
页面缓存 页面缓存
实战:
代码怎么独立出来乃?还是自己写一个流程。今天先到这里吧,代码实战再单独写一个
附件:
一、参考资料
①、淘宝阀门设计
②、各大电商网站秒杀流程
③、网络上面的各种文献资料
写在最后:
本人对并发处理并不深入,所知道的知识都是来源于网络资料和各种网站参考。虽然我这样的设计已经用于系统中,并且基本上解决了普通的这些问题,但是这样的设计可能存在一定的问题或者不完善,或者根本就是错误的。
转自:https://my.oschina.net/kenblog/blog/516659
转载于:https://www.cnblogs.com/itplay/p/10220397.html
【并发】关于并发、超卖处理的思路相关推荐
- 抢票或商品订单防并发、防超卖
分享一下自己项目开发过程中的设计方案,涉及到订单防并发.防超卖的需求,兼容类似抢票,订单需要锁定商品序号,付款后成交,超时或取消后需要将序号放回可以重新下单的需求. 目录 函数整体思路 代码实现 优化 ...
- 使用Redis分布式锁处理并发,解决超卖问题
使用Redis分布式锁处理并发,解决超卖问题 参考文章: (1)使用Redis分布式锁处理并发,解决超卖问题 (2)https://www.cnblogs.com/VitoYi/p/8726070.h ...
- 秒杀系统设计4要素:硬抗高并发,拒绝超卖,避免少卖,打击黄牛
双十一又要到了,牛牛有点慌,以前一个人的时候,一分钱都不花,现在有了女票,不仅得剁手,还得帮忙抢各种秒杀商品. 今年,牛牛真的不想再去抢秒杀了,为什么呢? 太难了,成千上万的人就盯着秒杀放出来的那点商 ...
- 库存出现负数 mysql_MySQL处理高并发,防止库存超卖库存出现负数
mysql处理高并发的方式比较多,以下为比较简单的一种(mysql事物控制) beginTranse(); try{ $result = $dbca->query('select amount ...
- php redis高并发秒杀超卖解决测试
<?php $redis = new Redis(); $redis->connect("0.0.0.0","6379"); // @$redis- ...
- 高并发超卖问题简要解决方案
1.传统通过数据库保证不超卖 事务+行锁并不是解决超卖的方案,只是保障数据的统一性.传统通过回滚事务的方式防止某些用户多卖的情况. 采用新建一个防重表+事务的方式防止超卖.同一事务中,采用如 用户ID ...
- Redis高并发场景下秒杀超卖解决
目录 1 什么是秒杀 2 为什么要防止超卖 3 单体架构常规秒杀 3.1 常规减库存代码 3.2 模拟高并发 3.3 超卖现象 3.4 分析原因 4 简单实现悲观乐观锁解决单体架构超卖 4.1 悲观锁 ...
- 秒杀的性能问题和超卖
秒杀的性能问题和超卖 抢订单环节一般会带来2个问题: 1.高并发 2.超卖 二.如何解决? 1.前端 A:扩容 B:静态化 C:限流 D:有损服务 2.后端 针对上述问题,如何解决呢? 我们先看眼淘宝 ...
- 【万级并发】电商库存扣减如何设计?不超卖!
随着中国消费认知的不断升级,网购走近千家万户,越来越被人们所接受.淘宝.唯品会.考拉.京东.拼多多等逐渐成为我们生活的重要组成部分. 除了常规的购物下单外,这些电商平台还经常搞一些双十一活动,秒杀.大 ...
- mysql处理高并发,防止库存超卖
参考:http://blog.csdn.net/caomiao2006/article/details/38568825 今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年 ...
最新文章
- Operations Manager 2012 SP1配置部署系列之(二) SCOM监控SCVMM
- 分享一段PowerShell用户认证Function
- linux I/O--I/O多路复用--select总结(三)
- HTML 事件属性_03
- 路由异常的起源-如何影响最终用户?——Vecloud微云
- 代码之谜(四)- 浮点数(从惊讶到思考)
- wxWidgets:wxCursor类用法
- mysql删除表中数据报错:[Err] 1206 - The total number of locks exceeds the lock table size
- javascript学习笔记(一)-廖雪峰教程
- android 获取元素的下标_Appium中定位方式by_android_uiautomator
- Bash脚本教程之数组
- c++创建二叉树_数据结构:查找(4)|| 平衡二叉树
- 阻塞非阻塞、同步异步
- “2021年度全球十大人工智能治理事件”:数据、算法、伦理受关注,AI发展需治理同行
- Seeds超像素分割
- 信息学奥赛一本通评测系统P1332
- 盘点:2017年GitHub上30个优秀的机器学习项目
- 宏基Acer笔记本热销火热机
- 校招生的中场战事:意向书,offer选择与三方
- 交叉编译Qt5.9.6
热门文章
- 【转载】对SVM的个人理解---浅显易懂
- SyntaxError: Non-ASCII character ‘\xe7’ in file car-training.py on line 7, but no encoding declared;
- 机器学习 python 随机抽样random sampling 代码
- mysql得花多少钱,php-我需要帮助来解决为什么mySQL查询花费比...
- 简述使jdbc连接mysql数据库_java中简述使用JDBC完成数据库操作的基本步骤。
- 基于springboot的物资管理系统
- python语法学习第十天--类与对象
- 遵守java编码规范
- springsecurity安全登录框架
- 2020-07-17