扣减库存的问题

来源:8-1 事务型消息(上)

夜很殇37

2019-09-18

 @Override
    @Transactional
    public boolean decreaseStock(Integer itemId, Integer amount) throws BusinessException {
        //result为redis中扣减完后的值
        Long result = redisTemplate.opsForValue().increment("promo_item_stock_" + itemId, amount.intValue() * -1);
        if (result >= 0) {
            //更新库存成功
            return true;
        } else if (result == 0) {
            //没有库存
            redisTemplate.opsForValue().set("promo_item_stock_valid_" + itemId, "true");
            return true;
        } else {
            //更新库存失败,回滚redis库存
            increaseSales(itemId, amount);
            return false;
        }

    }

老师,你好!
两个问题请教下

  1. 扣减库存这块代码,并没有加锁,在多线程环境下,扣减库存和回补库存,是会出现问题的吧??
  2. 扣减库存,中间加了mq,如果推出了消息,但是mq挂了,怎么解决呢
写回答

1回答

龙虾三少

2019-09-18

redis自身保证加减原子性 mq挂了不影响redis 仍然可以用redis操作 只是数据库同步无效了 等mq恢复会自动重发之前没有确认消费的消息

1
1
源细胞
老师,我目前的理解是:本课程使用的单机版redis,所以是不是在部署了redis集群的情况下才会考虑使用redis的分布式锁来保证不会出现超卖?
2020-01-05
共1条回复

聚焦Java性能优化 打造亿级流量秒杀系统(赠秒杀项目)

理解高流量电商网站性能构建思路 用高逼格技术解决性能提升问题

2174 学习 · 1009 问题

查看课程