基於PHP redis的秒殺系統

2021-08-02 02:59:47 字數 1091 閱讀 9469

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...