【轉】php結合redis實現高並發下的搶購、秒殺功能

來源:互聯網
上載者:User

標籤:nmp   tap   tox   並發   amp   fail   index   taf   非阻塞   

搶購、秒殺是如今很常見的一個應用情境,主要需要解決的問題有兩個:
1 高並發對資料庫產生的壓力
2 競爭狀態下如何解決庫存的正確減少("超賣"問題)
對於第一個問題,已經很容易想到用緩衝來處理搶購,避免直接操作資料庫,例如使用Redis。
重點在於第二個問題

常規寫法:

查詢出對應商品的庫存,看是否大於0,然後執行產生訂單等操作,但是在判斷庫存是否大於0處,如果在高並發下就會有問題,導致庫存量出現負數

最佳化方案1:將庫存欄位number欄位設為unsigned,當庫存為0時,因為欄位不能為負數,將會返回false

 

最佳化方案2:使用MySQL的事務,鎖住操作的行

 

最佳化方案3:使用非阻塞的檔案獨佔鎖定

最佳化方案4:使用redis隊列,因為pop操作是原子的,即使有很多使用者同時到達,也是依次執行,推薦使用(mysql事務在高並發下效能下降很厲害,檔案鎖的方式也是)

 

搶購、描述邏輯

 

類比5000高並發測試
webbench -c 5000 -t 60 http://192.168.1.198/big/index.php
ab -r -n 6000 -c 5000  http://192.168.1.198/big/index.php

 

上述只是簡單類比高並發下的搶購,真實情境要比這複雜很多,很多注意的地方
如搶購頁面做成靜態,通過ajax調用介面
再如上面的會導致一個使用者搶多個,思路:
需要一個排隊隊列和搶購結果隊列及庫存隊列。高並發情況,先將使用者進入排隊隊列,用一個線程迴圈處理從排隊隊列取出一個使用者,判斷使用者是否已在搶購結果隊列,如果在,則已搶購,否則未搶購,庫存減1,寫資料庫,將使用者入結果隊列。

 

測試資料表

 

 

【轉】php結合redis實現高並發下的搶購、秒殺功能

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.