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