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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值