高併發下的秒殺 搶東西

2021-07-31 23:38:07 字數 720 閱讀 1877

這裡以tp框架為例子:

這個方法核心就是鎖表和解鎖:

// 這裡鎖定tests表

m()->execute('lock tables tests write');

$data = m('tests')->find(1);

if($data['counts'] > 0 && m('tests')->where('id=1')->setdec('counts')) else

// 操作完之後解開鎖

m()->execute('unlock tables');

相比上面的方法,效率更高(核心:counts > 0(被減少的字段必須 >0)):

// 這裡主要利用了 `counts` 字段,sql如果有修改會返回修改的條數,當 `counts` 字段減少到 0 的時候再減就會返回修改的條數為 0 ,根據返回的修改條數的判斷也能實現是否搶成功

if(m('tests')->where('id=1 and counts > 0')->setdec('counts')) else

這裡不寫具體實現方式,大概原理:

redis發起鎖單請求。

redis返回結果為1表示鎖單成功(執行業務邏輯),0表示已經被上鎖(不能執行業務邏輯)。

業務邏輯執行完了向redis傳送乙個開鎖的請求。

高併發下商城秒殺活動的處理

秒殺搶購活動是現在很多 常見的營銷手段,小公尺搶購 的整點免單 聚划算等都是成功的例子。從簡單處著手,秒殺是很好理解的 設定要秒殺的商品的數量,搶完為止。但是,實際應用中一瞬間的高併發壓力 以及併發帶來的負庫存是要著重考慮。要避免負庫存的出現,可以在資料庫加鎖,不管外部多少請求,都可以在資料庫操作前...

PHP Redis解決高併發下的秒殺(樂觀鎖思路)

搶購 秒殺是平常很常見的場景,面試的時候面試官也經常會問到,比如問你 中的搶購秒殺是怎麼實現的等等。搶購 秒殺實現很簡單,但是有些問題需要解決,主要針對兩個問題 一 高併發對資料庫產生的壓力 二 競爭狀態下如何解決庫存的正確減少 超賣 問題 第乙個問題,對於php來說很簡單,用快取技術就可以緩解資料...

redis實現高併發下的搶購 秒殺功能

常規寫法 查詢出對應商品的庫存,看是否大於0,然後執行生成訂單等操作,但是在判斷庫存是否大於0處,如果在高併發下就會有問題,導致庫存量出現負數 redis的解決方案 1,inlcude oncea include db.php redis new redis resid connect 127.0....