回覆列表
-
1 # 愛上你愛的
-
2 # 有點IT
超賣問題的根本原因還是在於併發,服務端對於併發處理的能力不足造成了超賣問題;
應對高併發問題一方面要提高服務端的請求處理能力,比如使用redis的事務(witch+multi)來提高處理速度。
另一方面就是削峰;常見的方案是透過訊息佇列緩衝瞬時請求高峰;透過訊息佇列可以吧同步請求轉換成非同步推送通知,透過佇列一端承接瞬時訪問高峰,另一端則平滑地將訊息推送出去,達到削峰目的。
使用redis 的佇列+watch解決,把秒殺商品放入佇列,搶到則pop商品,佇列用完,則停止搶購
<?php header("content-type:text/html;charset=utf-8"); $redis = new redis(); $result = $redis->connect("127.0.0.1", 6379); $mywatchkey = $redis->get("mywatchkey"); $rob_total = 100; //搶購數量 if($mywatchkey<$rob_total){ $redis->watch("mywatchkey"); $redis->multi(); //設定延遲,方便測試效果。 sleep(5); //插入搶購資料 $redis->hSet("mywatchlist","user_id_".mt_rand(1, 9999),time()); $redis->set("mywatchkey",$mywatchkey+1); $rob_result = $redis->exec(); if($rob_result){ $mywatchlist = $redis->hGetAll("mywatchlist"); echo "搶購成功!<br/>"; echo "剩餘數量:".($rob_total-$mywatchkey-1)."<br/>"; echo "使用者列表:<pre>"; var_dump($mywatchlist); }else{ echo "手氣不好,再搶購!";exit; } } ?>