采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师您好,这里我不同意您说的increment实际是先查后扣。我记得increment本身是原子性的操作。 这里您出现库存多扣的原因应该是先扣库存,再判断count < 0 这两步不是原子性的,所以在高并发下才出现库存扣为负数。 这里只需要在 count <0 的时候把扣掉的库存再increment回去,然后再抛出异常。应该就可以解决库存超扣的问题。 以上仅是我的个人想法,有不对的地方还请老师指正。
是的,这里口误了,我的意思就是在业务层面扣库存和库存的判断会出现并发情况,然后把它放到lua脚本就可以避免,你说的count<0在还回去如果是在业务层面的话应该还是有问题,没有解决高并发问题,你可以试试看哈
谢谢老师解答,我在count<0的时候再increment++。 jmeter用十万个线程抢100个库存,经过几次测试没有出现库存被扣为负数的情况。 因为我们公司生产环境有类似的写法,如果有问题的话在高并发情况下可能会有灾难性后果。所以我想不通这种方案的问题在哪里,希望老师指点
你把你的代码贴出来,我看一下你怎么写的哈
@GetMapping("test") public JsonData test() { Long stock = redisTemplate.opsForValue().decrement("stock"); if (stock < 0) { redisTemplate.opsForValue().increment("stock"); return JsonData.buildError("库存不足"); } return JsonData.buildSuccess("扣库存成功"); } redis里面stock是100,用十万个线程跑完后stock为0,没有出现负数
登录后可查看更多问答,登录/注册
以项目整合Redis各种场景,从此轻松应对各类Redis难题
1.3k 11
2.3k 9
1.1k 8
847 7
1.1k 7
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号