如今在電商行業(yè)里,秒殺搶購活動已經是商家常用促銷手段。但是庫存數量有限兼耀,而同時下單人數超過了庫存量压昼,就會導致商品超賣甚至庫存變負數的問題。
比如:搶購火車票瘤运、論壇搶樓窍霞、抽獎乃至爆紅微博評論等也會引發(fā)阻塞式高并發(fā)問題。如果不做任何措施可能在高瞬間造成服務器癱瘓尽超。這里提供以下四種解決方案官撼。
1、使用文件鎖
<?php
$fp = fopen("order.lock", "r");
if(flock($fp,LOCK_EX)){
//..處理訂單的代碼
flock($fp,LOCK_UN);
}
fclose($fp);
?>
2似谁、使用消息隊列
可以基于例如MemcacheQ等這樣的消息隊列傲绣。
比如有100張票可供用戶搶掠哥,那么就可以把這100張票放到緩存中,讀寫時不要加鎖秃诵。 當并發(fā)量大的時候续搀,可能有500人左右搶票成功,這樣對于500后面的請求可以直接轉到活動結束的靜態(tài)頁面菠净。進去的500個人中有400個人是不可能獲得商品的禁舷。所以可以根據進入隊列的先后順序只能前100個人購買成功。后面400個人就直接轉到活動結束頁面毅往。當然進去500個人只是舉個例子牵咙,至于多少可以自己調整。而活動結束頁面一定要用靜態(tài)頁面攀唯,不要用數據庫洁桌。這樣就減輕了數據庫的壓力。
3侯嘀、如果是分布式集群服務器另凌,就需要一個或多個隊列服務器
小米和淘寶的搶購還是有稍許不同的,小米重在搶的那瞬間戒幔,搶到了名額吠谢,就是你的,你就可以下單結算诗茎。而淘寶則重在付款的時候的過濾工坊,做了多層過濾,比如要賣10件商品错沃,他會讓大于10的用戶搶到栅组,在付款的時候再進行并發(fā)過濾,一層層的減少一瞬間的并發(fā)量枢析。
4玉掸、使用Memcache鎖
product_key 為票的key
product_lock_key 為票鎖key
當product_key存在于memcached中時,所有用戶都可以進入下單流程醒叁。
當進入支付流程時司浪,首先往memcached存放add(product_lock_key, “1″),如果返回成功,進入支付流程把沼。如果不成啊易,則說明已經有人進入支付流程,則線程等待N秒饮睬,遞歸執(zhí)行add操作租谈。