php原生**編寫,沒有基於框架,主要讓使用者了解秒殺原理。
github:
seckill 秒殺系統
環境:1. php5.6 + phpredis擴充套件
2. redis服務
3. apache2
4. mysql:table 商品表(goods) + 訂單表(order)
實現功能:
1. 基於redis佇列,防止高併發的超賣
2. 基於mysql的事務加排它鎖,防止高併發的超賣
基於redis佇列工作流程:
1. 管理員根據goods表中的庫存,建立redis商品庫存佇列
2. 客戶端訪問秒殺api
3. web伺服器先從redis的商品庫存佇列中查詢剩餘庫存
4. redis佇列中有剩餘,則在mysql中建立訂單,去庫存,搶購成功
5. redis佇列中沒有剩餘,則提示庫存不足,搶購失敗
基於mysql事務和排它鎖工作流程:
1:開啟事務
2:查詢庫存,並顯示的設定寫鎖(排他鎖):select * from goods where id = 1 for update
3:生成訂單
4:去庫存,隱示的設定寫鎖(排他鎖):update goods set counts = counts – 1 where id = 1
5:commit,釋放鎖
注意:第二步不可以設定共享鎖,不然有可能會造成死鎖。
壓測工具:
apache自帶ab測試工具 ./ab -n1000 -c100 http://host/buy_mysql.php
apache自帶ab測試工具 ./ab -n1000 -c100 http://host/buy_redis.php
apache自帶ab測試工具 ./ab -n1000 -c100 http://host/buy_transaction.php
1. 修改 ./seckill/model/model.php的mysql資料庫鏈結資訊
2. 修改 ./seckill/redis/qredis.php的redis資料庫鏈結資訊
3. 訪問:http://host/index.php
github:
PHP Redis秒殺搶購
string型別 apache併發請求 c 客戶端 n請求數量 ab.exe c700 n6000 192.168 88.151 82 檔名.php redis new redis redis connect 127.0.0.1 6379 對某乙個鍵加鎖 redis watch sales redi...
PHP Redis實現商品秒殺程式
如果你家店裡某商品庫存只有100件,現在店慶活動5折優惠大酬賓,假如現在有200個人瘋狂湧入你家店裡,為了避免發生瘋搶和 件發生,店長您採取了排隊限購的辦法,1人限購1件,排隊先到先買,賣完為止。這個是實體店我們會看到的場景,100件商品,1人1件,最後200人中只有100人能買到商品,剩下100人...
PHP Redis秒殺其實很簡單
秒殺這個問題,一直以來都是經典的面試題。但是秒殺也分大小。如果乙個產品的使用者不超過5w,上來就問雙十一級別的秒殺。那就沒有意思了 所以今天就簡單聊下一般條件下的秒殺的思路。方法只有兩個,乙個是裝載秒殺商品。乙個就是模擬使用者進場秒殺。工具介紹 首先環境就比較簡單 apache php 7.3 re...