库存出库防止超卖,基于redis解决方案(未完)

1.构建超卖场景。

mysql + springboot +mybatis

1.1创建库存表

字段

id ,商品名,库存量。

库存出库防止超卖,基于redis解决方案(未完)_第1张图片

1.2 springboot创建减库存接口

 1.2.1接口的实现逻辑,先查询数量,大于本次出库量则扣减

// 最简单那的扣减库存 存在并发问题 超卖问题
    @PostMapping("/deCreateProduct")
    public void deCreateProduct( @RequestBody Product  product) {
        productService.deCreateProduct(product);
    }

库存出库防止超卖,基于redis解决方案(未完)_第2张图片    1.2.2  jmter测试 1000用户数并发执行。

库存出库防止超卖,基于redis解决方案(未完)_第3张图片

库存出库防止超卖,基于redis解决方案(未完)_第4张图片

1.2.3 测试前 阿莫西林3000 ,预期值执行完2000库存出库防止超卖,基于redis解决方案(未完)_第5张图片

 1.2.4实际执行后结果 只扣减了32个。

库存出库防止超卖,基于redis解决方案(未完)_第6张图片

 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}

                缺点 数据库的压力太大(基于行锁适合,并发量小的情况)

       库存出库防止超卖,基于redis解决方案(未完)_第7张图片库存出库防止超卖,基于redis解决方案(未完)_第8张图片

1.3 jmter 测试

        Apache JMeter - Download Apache JMeter 下载地址。

       Jmeter教程(一) - 入门_淡淡的说非的博客-CSDN博客_jmeter 使用教程。

1.3项目集成redis

1.31

你可能感兴趣的:(redis,mysql,spring,mysql,redis)