這裡以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....