解決秒殺時超賣問題的三種思路。
1.悲觀鎖。
2.隊列。
3.樂觀鎖。
悲觀鎖:不多贅述,拿商品庫存數據時便上鎖鎖死,進行阻塞等待。容易崩潰。
隊列:lpop的原子性進行操作。
樂觀鎖:用redis的watch監聽一個key,作爲版本判斷。
原理圖如下:
事例將庫存作爲版本key。請根據實際情況選擇,此處只是思路演示。
//假設庫存爲5件商品
$store = 5;
//redis監視,售賣了多少
$redis->watch('sales');
$sales = $redis->get('sales');
if($sales >= $stroe){
//賣出數量大於等於庫存 搶購結束
return;
}
//開啓事務
$redis->multi();
$redis->set('sales',$sales+1);
//提交事務
$bool = $redis->exec();
//判斷事務是否成功
if($bool){
//搶購成功
//進行db操作,此處省略
}else{
//搶購失敗
return ;
}
此上爲自我學習記錄。大神輕噴,歡迎提出建議和意見。
https://blog.csdn.net/weixin_38418601/article/details/104737301