秒殺簡單實現

秒殺的寫法:文件鎖,mysql鎖,redis隊列
流程:一、加鎖
二、判斷庫存
三、秒殺處理
四、解鎖
問題:高併發下,文件鎖,mysql 鎖都會產生卡鎖現象,致使服務器崩潰,而redis隊列也會偶發性出現超賣
解決辦法:redis樂觀鎖,經過監視鎖(key),原子執行
代碼以下(簡化):
 
include 'db.php';
 
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('123456');
 
$redis->watch('sales'); // 監視做用,監視一個或多個key,若是在事務執行以前被其餘事件改動,則事務會被打斷
 
// 獲取銷量
$sales = $redis->get('sales');
 
$sku = 5;
 
// 若是銷量大於庫存,則活動結束
if($sales >= $sku)
{
exit('活動結束');
}
 
$redis->multi(); // 事務,要麼成功提交,要麼不提交,被其餘用戶打斷,提交失敗
 
$redis->set('sales', $sales+1);
 
$res = $redis->exec(); // 事務提交
 
if($res)
{
$sql = "update products set sku = sku - 1 where id = 1";
if($db->exec($sql))
{
exit("減庫存成功");
}
}
相關文章
相關標籤/搜索