抽獎-搶購-秒殺解決方案分析
對資料庫產生壓力
apache自帶測試壓力工具 ab -c 250 -n 600
250表示併發數
600表示請求數
競爭狀態下-->庫存的正確減少(超賣)
產生原因:
mysql速度問題
沒有對搶購做限制,監視
前端方案:快取 擴容 流量限制
解決方案
1.檔案鎖->共享鎖(LOCK_SH),排它鎖(LOCK_EX)
$lockFile='lock.lock';
if(file_exists($lockFile)){
if(time()-filemtime($lockFile) > 600){
unlink($lockFile);
}
}
//兩種情況(flock) 阻塞模式 非阻塞模式
$fp=fopen('lock.txt','W+');
if(flock($fp,LOCK_EX)){
//處理訂單
flock($fp,LOCK_UN);
}
fclose($fp);
2.使用訊息佇列redis
快的原因:mysql是磁碟比快取慢的多 單執行緒 非關係型
使用生產者消費模式-->1,多個
1)釋出訂閱者模式
$redis=new Redis;
$result=$redis->connect('127.0.0.1','6379');
foreach($ids as $id){
$redis->lPush('send_list',$id);
}
2)樂觀鎖(監聽銷量)
$redis=new Redis;
$redis->connect('127.0.0.1','6379')
$redis->watch('count');
$count=$redis->get('count');
$num=2
if($count>=$num){
exit('活動結束');
}
$redis->multi();//開啟事務之後才會將命令放入到佇列中,不執行
$redis->set('count',$count+1);
sleep(1);
$res=$redis->exec();//按命令放入先後順序執行,如果監視的資料被修改,則執行命令失敗
set
watch
get
//永久執行
//守護程序
分散式叢集伺服器--一個或者多個佇列伺服器
分散式快取
分散式RPC
訊息中介軟體
高併發分流