老师,
你好!请问redisTemplate.opsForValue().increment(key,amount*(-1))这个操作,如果有多线程(多用户)同时执行这个操作扣减库存,会不会有所不妥?
比如原有库存4,同时有两条线程甲和乙分别需要购买3个和2个库存。即便redis是单线程模型,可以将请求串行为先扣甲的3个,再扣乙的2个。
甲可以被顺利扣除,并且库存更新为4-3=1个,并且记录订单信息到消息队列。
乙执行了1-2=-1<0,扣减库存失败,并且无法下订单。
但此时由于库存已经被置为-1了,没法再接收后面的其他人新的下单了,只有当后面判断false的时候再加回去,后来者才可以重新下单。
是否需要引入类似cas/分布式锁的机制在increment(key,amount*(-1))这个操作前做一下检查?
比如扣减库存前先使用抢占redission的redlock,抢到了之后查询一下库存数量是否大于当前需要扣减的amount,要是是的话,再执行increment(key,amount*(-1))?