解決秒殺高並發問題方法很多,如悲觀鎖,消息隊列等……
利用樂觀鎖及redis解決秒殺高並發基本邏輯
//初始化redis
$redis = new Redis();
// 設置鍵值,起到監視作用 執行事務之前,判斷被修改,回滾
$redis->watch('sales');
// 獲取銷量
$sales = $redis->get('sales');
// 如果銷量存在,先刪除,false
// $redis->del('sales');
// 庫存,秒殺兩件產品
$store = 2;
// 判斷銷量是否大於等於庫存
if($sales >= $store){
// 結束
exit('活動結束');
}
// 事務塊內多條命令會按先后順序放入一個隊列中,最后有EXEC命令原子性的執行
//redis開啟事務
$reids->multi();
// 更新銷量
$redis->set('sales', $sales+1);
$res = $redis->exec();
// 記錄到redis里面,用守護進程 swoole多進程去執行 !!!
if($res){
// 減庫存冀其他操作
}