作电商网站,常常会有各类秒杀和热门商品,因此高并发的处理一直是电商最重要的事情。这里记录下当初本身是如何处理的数据库
写在前面:缓存
一、本文设计到的并发处理均是针对纵向,不针对横向扩展,即只设计从PHP层面到数据库层面的处理,不涉及多台服务器,集群、大带宽等的横向设计。服务器
二、本文中涉及到的高并发并非淘宝京东等几百万几千万等的高并发,仅仅只是普通最多上万的并发处理网络
三、本文不对悲观锁乐观锁作设计并发
问题:高并发
普通电商中的秒杀中的并发问题,超卖问题网站
实例:商品数量为100,秒杀人数为10000,整点开始秒杀.net
秒杀大概流程:设计
①商品详情点击购买(秒杀)--》②输入信息提交订单--》③进行支付blog
解决思路:
一、人数阀门设计
二、会员排队设计
三、问答问题设计
四、库存缓存设计
五、页面静态设计
思路理解:
1、人数阀门设计:进行用户人群过滤。
商品数量只有100份,秒杀人数有10000人,那么咱们就设计1道阀门(根据状况,能够设计3道或者2道均可以的)。
在整点的时候,咱们对点击了“购买”按钮后,咱们只运行500人进入信息填写页面,信息填写完成后提交订单。效果以下:
①商品详情点击购买(秒杀)--》②输入信息提交订单--》③进行支付
10000人 500人 (这里也能够设计阀门,只容许多少人进入支付)
其余未进入的如何处理乃?显示已抢完或者排队等待(这就是后面要提到的排队系统设计)。
2、会员排队设计:对用户进行排队,排在前面的先购买
这至关因而消息队列模式了,若是秒杀是当即知道结果,排队可能会有点鸡肋。
在第二步②输入信息提交订单后进行排队,排在前面的先购买,排在后面的后购买
3、问答问题设计:过滤掉一些反应慢的用户
在第一步①点击购买后跳转到问题页面,用户必须回答正确问题后,方可进入后面的流程
4、库存缓存设计:缓存库存,判断用户购买的商品是否还有,不读取数据库,速度快,也不会增长数据库负担,通过前面的过滤,超卖的可能性比较低了
提早将商品库存缓存起来,到下单购买的时候,用户购买了就减1,每次都经过库存缓存判断一下,若是为0就显示已抢完。
5、页面静态设计:尽可能静态缓存化【CDN那些这里不作考虑】
第一步①商品详情页面,尽可能进行缓存,减轻大批量用户在访问商品页面的时候,大量查询数据库。
问答问题页面:全静态,加载快,无数据库负担。
排队等待页面:全静态,加载快,无数据库负担。
排队结束页面:全静态,加载快,无数据库负担。
小试牛刀:
上面说了那么多废话,总归在一块儿,流程大概就成了下面这样:
①商品详情点击购买(秒杀) --》 ②进入问题回答页面 --》③排队等待 --》 ④输入信息提交订单 --》 ⑤进行支付
页面缓存 问题过滤 阀门过滤 缓存库存减小
页面缓存 页面缓存
实战:
代码怎么独立出来乃?仍是本身写一个流程。今天先到这里吧,代码实战再单独写一个
附件:
1、参考资料
①、淘宝阀门设计
②、各大电商网站秒杀流程
③、网络上面的各类文献资料
写在最后:
本人对并发处理并不深刻,所知道的知识都是来源于网络资料和各类网站参考。虽然我这样的设计已经用于系统中,而且基本上解决了普通的这些问题,可是这样的设计可能存在必定的问题或者不完善,或者根本就是错误的。
转自:https://my.oschina.net/kenblog/blog/516659