【Redis】电商项目秒杀问题之超卖问题与一人一单问题

文章探讨了电商场景中的超卖问题及其线程安全解决方案,包括悲观锁和乐观锁(版本号和CAS)的应用,并提出了解决新问题的策略。此外,文章还讨论了一人一单的实现,强调了针对用户加锁的重要性以及事务管理在防止多下单中的作用。最后,指出了集群环境下需要分布式锁来确保并发安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、超卖问题

1、背景

2、产生原因以及线程安全问题

3、解决

1.悲观锁

2.乐观锁

4、新的问题

5、解决

二、一人一单

1、背景

2、产生原因以及线程安全问题

3、解决

4、新的问题

5、解决

三、集群下的并发问题

1、说明

2、解决


一、超卖问题

1、背景

在如双11等购物需求剧增的背景下,一个物品库存里有100件但是由于并发等问题可能会导致该物品被卖出超过100件。这就是超卖问题,他是由于库存量被高并发请求而产生的线程安全问题。

2、产生原因以及线程安全问题

当库存仅为1的时候,此时由于并发量高多个线程进行库存查询操作,此时这些线程都查询到库存为1,都各自去进行后续下单扣减库存的操作,此时库存被扣减多次成为负数,产生超卖问题,也就是线程安全问题 

3、解决

对于上述超卖的线程安全问题我们可以采用两种方式来解决

1.悲观锁

首先悲观锁的概念是他认为一定会产生线程安全问题所以采用直接加锁的方法,我们此处可以对伤处库存查询于库存扣减操作加锁来处理,但是加锁也要注意防止锁释放了其他线程获取到了锁,但是之前的事务还没有提交,这又会产生新的问题,下面会提到。

2.乐观锁

版本号:

乐观锁的方式我们可以通过给库存来加一个版本号,当线程1与线程2同时读取到库存都为1时,此时版本号也为1,线程1进行了扣减库存操作修改数据库时,加版本号判断的条件:数据库里版本号与上面查询库存时的版本号相同则修改成功,此时线程1修改时数据库中版本号为1,上面查询库存时版本号也为1则修改成功,这个时候线程2也进行扣减库存操作,当他去修改数据库时,发现他在查询库存时的版本号为1,但是数据库中由于线程1已经修改版本号为2,此时线程2则不能扣减成功。

CAS: 

我们也可以采用CAS的办法,线程1与2查询库存都为1&#x

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1886i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值