如今在電商產業裡,秒殺搶購活動已經是商家常用促銷手段。但是庫存數量有限,同時下單人數超過了庫存量,就會導致商品超賣甚至庫存變負數的問題。 又例如:搶購火車票、論壇搶樓、抽獎甚至爆紅微博評論等也會引發阻塞式高並發問題。如果不做任何措施可能在高瞬間造成伺服器癱瘓,如何解決這個問題? 這裡提出個人認為比較可行的幾個思路方法:方案一:使用消息隊列來實現可以基於例如Meache表述吧例如有100張票可供用戶搶,那麼就可以把這100張票放到快取中,讀寫時不要加鎖。 當並發量大的時候,可能有500人左右搶票成功,這樣對於500後面的請求可以直接轉到活動結束的靜態頁面。進去的500個人中有400個人是不可能取得商品的。所以可以根據進入
隊列
的先後順序只能由前100個人購買成功。後面400個人就直接轉到活動結束頁面。當然進去500個人只是舉個例子,至於多少可以自己調整。而活動結束頁面一定要用靜態頁面,不要用資料庫。這樣就減輕了資料庫的壓力。 方案二:當有多台伺服器時,可以採用分流的形式實現
假設有m張票, 有n台產品伺服器接收請求,有x個請求路由伺服器隨機轉送
給每台產品伺服器分配m/n張票
每台產品伺服器記憶體做
計數器
,例如允許m/n*(1+0.1)個人進來。 當記憶體
計數器
已滿:後面進的人, 直接跳到到轉到活動結束的靜態頁面,
通知路由伺服器,不在路由到這台伺服器(這個值得討)。
所有產品伺服器進來的m/n*(1+0.1)個人再全部轉發到一台付款伺服器上,進入付款環節,看誰手快了,這時候人少,加鎖什麼的就簡單的。
方案三、如果是單一伺服器,可以使用Memcache鎖來實現
product_key 為票的key
product_lock_key 為票鎖key進入下單流程。
當進入支付流程時,首先往memcached存放add(product_lock_key, “1″),
如果返回成功,進入支付流程。
如果不成,則表示已經有人進入支付流程,則執行緒等待N秒,遞歸執行add操作。
方案四、借助文件排他鎖
在處理下單請求的時候,用flock鎖定一個文件,如果鎖定失敗說明有其他訂單正在處理,此時要么等待要么直接提示用戶"服務器"
本文要說的是第4種方案,大致程式碼如下
阻塞(等待)模式:
<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
//..处理订单
flock($fp,LOCK_UN);
}
fclose($fp);
?>
登入後複製
以上就介紹了PHP解決搶購、秒殺、搶樓、抽獎等阻塞式高並發庫存防控超量的思路方法,包括了隊列,秒殺,人數,計數器方面的內容,希望對PHP教程有興趣的朋友有所幫助。