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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP Redis超卖是指在使用PHPRedis实现商城秒杀功能时,由于并发操作导致商品库存被多次减少,最终超出了实际库存数量。具体来说,对于秒杀活动,当多个用户同时请求购买同一件商品时,如果不采取合适的措施,可能会导致库存被重复减少,从而造成超卖的情况。 在给出解决方案之前,我们先了解下引用内容中的两种解决超卖问题的方法: 引用中的方法是使用Redis的原子性的递增递减操作来处理超卖问题。首先,从Redis中取出商品的库存数量,然后使用Redis的decr操作对库存进行减1操作。如果减1后的库存小于等于0,表示商品已经售罄,抛出异常。接下来,使用MySQL的事务对商品库存进行减1操作,并将订单信息写入数据库。如果事务执行成功,则提交事务;如果事务执行失败,则回滚事务,并将库存恢复到之前的值。 引用中的方法是使用malkusch/lock库来实现加锁操作。首先,通过传入一个Predis实例创建一个锁,并设置锁的释放时间为10秒。然后,在加锁的代码块内执行秒杀逻辑,包括从数据库获取库存数量并进行减1操作,并将订单信息写入数据库。最后,释放锁。 为了解决超卖问题,可以综合以上两种方法来进行处理。首先,使用Redis的decr操作对库存进行减1操作,并判断减1后的库存是否小于等于0,如果是则表示商品已经售罄,抛出异常。接下来,使用malkusch/lock库进行加锁操作,确保在并发情况下只有一个请求能够执行秒杀逻辑。在加锁的代码块内,执行MySQL的事务操作,包括对商品库存进行减1操作和将订单信息写入数据库。如果事务执行成功,则提交事务;如果事务执行失败,则回滚事务,并将库存恢复到之前的值。 综上所述,通过结合Redis的原子性操作和加锁操作,可以有效地解决PHP Redis超卖问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [php+redis实现商城秒杀功能](https://download.csdn.net/download/weixin_38680247/12959117)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [php 解决超卖的几种方案(redis锁、mysql悲观锁)](https://blog.csdn.net/weixin_39734609/article/details/120302338)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值