概述
1.构建超卖场景。
mysql + springboot +mybatis
1.1创建库存表
字段
id ,商品名,库存量。
1.2 springboot创建减库存接口
1.2.1接口的实现逻辑,先查询数量,大于本次出库量则扣减
// 最简单那的扣减库存 存在并发问题 超卖问题
@PostMapping("/deCreateProduct")
public void deCreateProduct( @RequestBody Product product) {
productService.deCreateProduct(product);
}
1.2.2 jmter测试 1000用户数并发执行。
1.2.3 测试前 阿莫西林3000 ,预期值执行完2000
1.2.4实际执行后结果 只扣减了32个。
1.2.5结果分析
方法代码逻辑
1.查询数量,
2.判断大小
3.计算扣减
4.修改数据
并发场景下,出现在计算扣减上,
例如
A查询时3000
计算完 3000-1
然后修改2999
B也查询出3000
计算完 3000-1
然后修改2999
出现了复写,导致数据不正确
1.2.5解决方案
解决方式基于mysql的乐观锁 在更新的时候,使用(CAS+版本号更新)+重试条件(重试次数或者重试时间限制)乐观锁的方式更新库存。
select amout ,id , version ------
update xx set amout where id== and version =#{version}
解决方式基于mysql的行锁机制
update product
set amout = amout- #{amout}
where id = #{id}
and amout >= #{amout}
缺点 数据库的压力太大(基于行锁适合,并发量小的情况)
1.3 jmter 测试
Apache JMeter - Download Apache JMeter 下载地址。
Jmeter教程(一) - 入门_淡淡的说非的博客-CSDN博客_jmeter 使用教程。
1.3项目集成redis
1.31
最后
以上就是背后诺言为你收集整理的库存出库防止超卖,基于redis解决方案(未完)的全部内容,希望文章能够帮你解决库存出库防止超卖,基于redis解决方案(未完)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复