需求分析
在分享源码之前,先将b2b2c系统中商品模块需求整理、明确,方便源码的理解。
业务需求
- b2b2c电子商务系统中商品的库存存放在redis和数据库中,实现发货退货等操作库存的扣减或增加
技术需求
- redis事务问题,若扣减库存完成后,发生异常,则redis没有事务,无法实现数据回滚,导致数据异常
- 采用lua脚本扣减库存方式,原子性提交操作,lua脚本中实现扣减失败则回滚操作
- 数据库中的库存信息,非实时更新,而是采用缓冲池方式,缓冲池方式可以自主选择是否开启
架构思路
商品库存领域模型架构
![eb9df2bd11eb28a89a61a38c27d34819.png](https://img-blog.csdnimg.cn/img_convert/eb9df2bd11eb28a89a61a38c27d34819.png)
基于lua+redis的库存扣减
GoodsQuantityVO
/** * 商品库存vo * @author fk * @version v6.4 * @since v6.4 * 2017年9月7日 上午11:23:16 */public class GoodsQuantityVO implements Cloneable{ private Integer goodsId; private Integer skuId; private Integer quantity; private QuantityType quantityType; public GoodsQuantityVO() {} public GoodsQuantityVO(Integer goodsId, Integer skuId, Integer quantity ) { super(); this.goodsId = goodsId; this.skuId = skuId; this.quantity = quantity; } setter and getter}
GoodsQuantityManager
/** * 商品库存接口 * @author fk * @version v2.0 * @since v7.0.0 * 2018年3月23日 上午11:47:29 * * @version 3.0 * 统一为一个接口(更新接口)
* 内部实现为redis +lua 保证原子性 -- by kingapex 2019-01-17 */public interface GoodsQuantityManager { /** * 库存更新接口 * @param goodsQuantityList 要更新的库存vo List * @return 如果更新成功返回真,否则返回假 */ Boolean updateSkuQuantity(List goodsQuantityList ); /** * 同步数据库数据 */ void syncDataBase(); /** * 为某个sku 填充库存cache
* 库存数量由数据库中获取
* 一般用于缓存被击穿的情况 * @param skuId * @return 可用库存和实际库存 */ Map fillCacheFromDB(int skuId);}
GoodsQuantityManagerImpl
库存业务类基于lua+redis的实现:
/** * 商品库存接口 * * @author fk * @author kingapex * @version v2.0 written by kingapex 2019年2月27日 * 采用lua脚本执行redis中的库存扣减
* 数据库的更新采用非时时同步
* 而是建立了一个缓冲池,当达到一定条件时再同步数据库
* 这样条件有:缓冲区大小,缓冲次数,缓冲时间