redis超卖问题

本文探讨了超卖问题中的多线程安全问题,介绍了悲观锁(如Synchronized和Lock)的预设锁定策略,以及乐观锁(依赖于版本号法和CAS算法)的无锁更新方式。重点讲解了两种方法如何判断数据并发修改并确保一致性。
摘要由CSDN通过智能技术生成

介绍

        超卖问题是典型的多线程安全问题,针对这一问题的常见解决方案就是加锁

锁的类型

1.悲观锁

认为线程安全问题一定会发生,因此在操作数据之前先获取锁,确保线程串行执行。

例如Synchronized、Lock都属于悲观锁

2.乐观锁

认为线程安全问题不一定会发生,因此不加锁,只是在更新数据时去判断有没有其他线程对数据做了修改。如果没有修改则认为是安全的,自己才更新数据。如果已经被其他线程修改说明发生了安全问题,因此可以充实或则异常。

关键 

        判断之前查询得到的数据是否又被修改过,常见的方式有两种。

1.版本号法

2. CAS法

PHP Redis超卖是指在使用PHP和Redis实现商城秒杀功能时,由于并发操作导致商品库存被多次减少,最终超出了实际库存数量。具体来说,对于秒杀活动,当多个用户同时请求购买同一件商品时,如果不采取合适的措施,可能会导致库存被重复减少,从而造成超卖的情况。 在给出解决方案之前,我们先了解下引用内容中的两种解决超卖问题的方法: 引用中的方法是使用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、付费专栏及课程。

余额充值