首页 > 其他分享 >互联网电商大厂库存系统设计案例讲解

互联网电商大厂库存系统设计案例讲解

时间:2022-11-26 12:04:50浏览次数:62  
标签:comment 库存 扣减 数据库 null 大厂 讲解 电商 id


1 库存扣减

互联网电商大厂库存系统设计案例讲解_数据库

多人同时买一件商品时(假设库存充足),每个人几乎同时下单成功,给人一种并行感觉。但真实情况, 库存只是一个数值,无论是存在mysql数据库还是redis缓存,减值时都要控制顺序,只能串行来扣减,当然为保证安全性,会设计一些锁控制。

1.1 关键技术点

  • 同一个SKU,库存数量是共享
  • 剩余库存要大于等于本次扣减的数量,否则超卖
  • 对同一个数量多用户并发扣减时,要注意并发安全,保证数据的一致性
  • 类似于秒杀这样高QPS的扣减场景,要保证性能与高可用
  • 对于购物车下单场景,多个商品库存批量扣减,要保证事务
  • 如果有 交易退款 ,保证库存扣减可返还
  • 返还的数据总量不能大于扣减的总量
  • 返还要保证幂等
  • 可以分多次返还

1.2 数据库扣减

主要依赖数据库特性,保证扣减的一致性,逻辑简单,开发部署成本低。

1.2.1 依赖的数据库特性

  • 依赖数据库的乐观锁(如版本号或者库存数量)保证数据并发扣减的强一致性
  • 事务,针对购物车下单批量扣减时,部分扣减失败,数据回滚

互联网电商大厂库存系统设计案例讲解_数据库_02

最上面会查询当前的剩余库存(可能不准确,但没关系,这里只是第一步粗略校验),前置校验,如果已经没有库存,前置拦截生效,减少数据库写。毕竟读操作不涉及加锁,并发性能高。

2 数据库表

2.1 库存表

create table t_inventory
(
sku_id bigint null comment '商品规格 id',
leaved_amount int null comment '剩余可购买数量'
);
  • 当用户取消订单,申请退货、退款,需将数量加回来
  • 若商家补库存,需在此基础额外加上增量库存

2.2 流水表

create table t_inventory_flow
(
id bigint auto_increment comment '主键 id'
primary key,
sku_id int null comment '商品规格 id',
order_detail_id mediumtext null comment '订单明细 id',
quantity_trade int null comment '本次购买扣减的数量'
);
  • 用于查看明细、对账、盘货、排查问题
  • 扣减后,某些场景下做返还,也还依赖流水

2.3 单条商品的扣减SQL

update inventory 
set leaved_amount = leaved_amount - #{count}
where sku_id='123' and leaved_amount >= #{count}

乐观锁实现原子性,在 where 条件里判断此次购买的数量≤剩余的数量。在扣减服务的代码,判断此 SQL 的返回值,若:

  • 值为 1 ,表示扣减成功
  • 否则,返回 0 ,表示库存不足,需回滚

2.4 扣减成功后,记录扣减的流水,并与订单明细记录关联

  1. 当用户归还数量时,需带回此编号,标识此次返还属于历史上的具体哪次扣减。
  2. 进行幂等控制。当用户调用扣减接口出现超时,因为用户不知道是否成功,用此编号进行重试或反查。在重试时,使用此编号进行标识防重

3 数据库扣减方案:第一次升级

极端例子:秒杀库存只有5件,活动期间峰值QPS 10W,活动结束后,上面的流水表最终只会插入5条记录,但查询QPS 10W。

所以,数据库扣减方案第一次升级主要针对 库存前置校验 模块的优化,作为前置拦截器,承载流量很大,若将流量全部压到主库,很容易把数据压垮。

考虑数据库架构升级:

互联网电商大厂库存系统设计案例讲解_java_03

采用了 读写分离 方式,新增加了一套从库,借助mysql自带的数据同步能力。 库存校验时读取从数据库。


标签:comment,库存,扣减,数据库,null,大厂,讲解,电商,id
From: https://blog.51cto.com/u_11440114/5888793

相关文章

  • 金蝶云星空与吉客云电商ERP数据对接
    01系统说明:吉客云吉客云: 从业务数字化和组织数字化两个方向出发,以生成流程的闭环为依归,致力于为企业的数字化升级提供落地工具。销售订单层面,吉客云对接了国内外主流的销......
  • 金蝶云星空与吉客云电商ERP数据对接
    01系统说明:吉客云吉客云: 从业务数字化和组织数字化两个方向出发,以生成流程的闭环为依归,致力于为企业的数字化升级提供落地工具。销售订单层面,吉客云对接了国内外主流......
  • [HTML+CSS]电商网站模板
    [HTML+CSS]电商网站模板b站白嫖的网课,黑马的小兔鲜儿案例,教程链接点这里就行成品文件目录结构CSSbase.css:基本样式,内外边距,字体之类的common.css:网页的公共样式,一般是heade......
  • 2.4G讲解
    前言:无线技术2.4GHz是工作在ISM频段的一个频段。由于其频段处于2.400GHz~2.4835GHz之间,所以简称2.4G无线技术。ISM频段是工业、科学和医用频段。一般来说世界各国均保留了......
  • 电商平台减库存有哪几种方式
    在正常的电商平台购物场景中,用户的实际购买过程一般分为两步:下单和付款。你想买一台iPhone手机,在商品页面点了“立即购买”按钮,核对信息之后点击“提交订单”,这一步称为下......
  • Mapper层注解讲解
    目录1Mapper层注解[email protected]@Mapper1.3@Mapper和@MapperScan区别[email protected]基本用法1.4.2@Select注解动态SQL拼写[email protected]@Param注解基本类......
  • 数据库(部分讲解)
    SQL语句查询关键字单关系查询是指只一张表中的内容查询有关信息,不涉及其他的表,这是查询中最为基本的一种情况类型含义select表示要查找出的表所含有的属性f......
  • 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的
    ​​ 李华明Himi ​​​原创,转载务必在明显处注明       前几节由于时间紧张,只是将一些遇到的问题拿出来进行分享经验,那么今天抽空写一篇常用的精灵以及精......
  • 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android
    本站文章均为​​ 李华明Himi ​​​原创,转载务必在明显处注明很多看过之前Himi的​​【iOS-cocos2d-X游戏开发之七】整合Cocos2dX的Android项目到Xcode项目中,Xcode编写......
  • 数据结构初阶--单链表(讲解+类模板实现)
    单链表概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。值得注意的是:1.链表的在逻辑是连续的,物理上不一......