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

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。
