Redis秒杀预防超卖逻辑

解决秒杀时超卖问题的三种思路。
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章