活着说是在对账过程中redis中的缓存版本和数据库中的库存版本不能在发生变动, 为什么对账不允许下单如下图就能感知到对账过程中 查询数据库 然后set redis 如果在这个过程中下单了没感知到那么就会出现超卖
场景 抢券,下单,库存扣减,使用redis库存扣减,然后在更新数据库,结果就导致redis库存扣减成功了,数据库更新失败或者redis下面的代码执行异常导致事务回滚,但是redis却没有回滚,就会导致,数据库库存数量没扣减,但是redis库存扣减了。 分析 需要从两个方面分析 要想保证缓存和数据库「实时」一致性 就需要解决两个问题 ...
付款减库存即买家下单后,并不立即减库存,而是等到有用户付款后才真正减库存,否则库存一直保留给其他买家。但因为付款时才减库存,如果并发比较高,有可能出现买家下单后付不了款的情况,因为可能商品已经被其他人买走了。 预扣库存这种方式相对复杂一些,买家下单后,库存为其保留一定的时间(如 10 分钟),超过这个时间,...
synchronized (this){ int stock=Integer.parseInt(stringRedisTemplate.opsForValue().get("stock")); if(stock>0){ int realStock=stock-1; stringRedisTemplate.opsForValue().set("stock",realStock+""); System.out.println("扣减成功,剩余库存:"+realStock); }else{ System.out.println("扣减失败,库...