Redis秒杀预防超卖逻辑

解决秒杀时超卖问题的三种思路。
1.悲观锁。
2.队列。
3.乐观锁。

悲观锁:不多赘述,拿商品库存数据时便上锁锁死,进行阻塞等待。容易崩溃。
队列:lpop的原子性进行操作。
乐观锁:用redis的watch监听一个key,作为版本判断。

原理图如下:
Redis秒杀预防超卖逻辑_第1张图片
事例将库存作为版本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

你可能感兴趣的:(Redis秒杀预防超卖逻辑)