在电商分布式项目中,需要考虑提交订单时,因为并发的原因导致库存异常的情况。
其中一个解决方案是:使用redis锁,因为Redis是单线程的,即线程安全的;在提交订单的时候,先通过Redis锁进行库存判断,如果库存校验通过,则正常提交顶顶那,否则返回失败。
具体逻辑如下:
1- 用户请求提交订单接口,接口内先通过Redis锁进行库存校验(如果第一次获取锁失败,则会继续请求锁,但不超过5次);
2- Redis锁进行库存校验,从订单层面具有排他性(即一个订单在进行Redis锁库存校验时),其它提交的订单只能等待。
3- 且Redis锁进行库存校验,做两件事:(1)进行Redis库存校验,如果库存不够,则返回false;否则继续(2);(2)进行Redis减库存操作。
4-Redis锁进行库存校验通过后,订单信息被正常提交。
具体代码如下
@Autowired
private CommonRedisHelper commonRedisHelper;
public final static String PREFIX_LOCK_ORDER_SUBMIT = "lock_orderSubmit";
//校验并更新库存
public Boolean updateStockToRe