当前位置: 首页 > news >正文

如何设计一个合理的库存系统

库存管理系统是电商、供应链管理、仓储管理等核心系统之一。一个合理的库存系统需要同时满足高并发、数据一致性、实时性、扩展性等要求,以确保在各种业务场景下都能稳定运行。

本文将探讨如何设计一个合理的库存系统,包括库存模型设计、数据一致性策略、高并发处理、事务控制、库存优化算法等方面。

一、库存系统的核心需求

在设计库存系统之前,我们需要明确业务需求。通常,一个库存系统需要满足以下功能:

  1. 库存查询:支持按 SKU、仓库、地区等维度查询库存情况。

  2. 库存变更

    • 扣减库存(用户下单)

    • 增加库存(采购入库、退货入库)

    • 预占库存(订单待支付时的锁定库存)

    • 释放库存(订单取消或支付超时)

  3. 库存状态管理

    • 可用库存(可直接售卖的库存)

    • 预占库存(被订单占用但未支付的库存)

    • 在途库存(采购/调拨未到货的库存)

  4. 并发控制:防止超卖,确保数据一致性。

  5. 高可用性:支持大促时高并发场景,如双11、618等。

二、库存表结构设计:是否合并库存状态?

在库存系统中,可用库存、预占库存和在途库存是否存放在同一张表,取决于业务复杂度和系统的查询需求。常见的两种设计方式如下:

方案一:单表存储

所有库存相关的字段存储在一张 inventory 表中,每个 SKU 在每个仓库中的库存情况都存储在该表。

CREATE TABLE inventory (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id BIGINT NOT NULL,
    warehouse_id BIGINT NOT NULL,
    available_stock INT NOT NULL DEFAULT 0, -- 可用库存
    reserved_stock INT NOT NULL DEFAULT 0, -- 预占库存
    in_transit_stock INT NOT NULL DEFAULT 0, -- 在途库存
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY (product_id, warehouse_id)
);

优点

  • 方便查询库存状态,无需跨表查询,适用于高频查询场景。

  • 事务管理简单,可以使用单表事务保证数据一致性。

缺点

  • 并发更新压力较大,尤其是大促时库存变更频繁。

  • 预占库存和可用库存需要在同一事务内更新,可能会引起行锁争用。

方案二:分表存储

可用库存预占库存在途库存 存放在不同的表中,分开管理。

1. 可用库存表
CREATE TABLE available_inventory (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id BIGINT NOT NULL,
    warehouse_id BIGINT NOT NULL,
    available_stock INT NOT NULL DEFAULT 0,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY (product_id, warehouse_id)
);
2. 预占库存表
CREATE TABLE reserved_inventory (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    warehouse_id BIGINT NOT NULL,
    reserved_stock INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    expires_at TIMESTAMP NOT NULL,
    UNIQUE KEY (order_id, product_id, warehouse_id)
);
3. 在途库存表
CREATE TABLE in_transit_inventory (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    purchase_order_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    warehouse_id BIGINT NOT NULL,
    in_transit_stock INT NOT NULL,
    expected_arrival_date DATE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY (purchase_order_id, product_id, warehouse_id)
);

优点

  • 读写分离,降低单表写入压力。

  • 事务操作相对独立,减少锁冲突,提高并发能力。

缺点

  • 查询库存状态时需要跨表关联,查询复杂度增加。

  • 数据同步需要额外维护,例如定时任务或消息队列更新不同表的数据。

三、选择适合的库存模型

何时选择单表存储?

  • 业务规模较小,查询库存频率高。

  • 并发写入压力不大,能接受行锁带来的影响。

  • 需要实时查询库存状态,避免跨表查询。

何时选择分表存储?

  • 高并发场景,如电商大促,避免单表锁争用。

  • 业务复杂,需要单独管理预占库存、在途库存。

  • 采用异步架构,库存状态可以异步更新。

四、库存变更的事务控制

无论采用哪种库存模型,事务控制都是核心问题,以下是常见的库存变更流程:

  1. 扣减库存(用户下单):

    • 可用库存减少。

    • 预占库存增加。

  2. 支付成功

    • 预占库存减少。

  3. 支付失败/取消订单

    • 预占库存减少。

    • 可用库存回滚。

采用 数据库事务分布式事务(如 TCC、Saga) 确保一致性。

结论

库存系统的设计需要权衡查询性能、并发能力和事务一致性。针对不同的业务场景,可以选择单表存储(适用于小规模业务)或分表存储(适用于高并发场景)。

在高并发情况下,合理使用缓存、事件驱动、限流、分布式事务,可以进一步提升库存系统的稳定性和扩展性。

相关文章:

  • 资源-HDR/材质/模型
  • AI大模型介绍
  • Seata框架 分布式事务实战 Demo-1
  • 二叉树的层平均值
  • 企业信息化的“双螺旋”——IT治理和数据治理
  • 北京市大模型备案及登记分析报告
  • 【设计模式】SOLID 设计原则概述
  • oracle 索引
  • 【鸿蒙开发】Hi3861学习笔记- WIFI应用AP建立网络
  • Python---数据分析(Pandas六:二维数组DataFrame,DataFrame的创建,DataFrame的属性)
  • CSS实现当鼠标悬停在一个元素上时,另一个元素的样式发生变化的效果
  • 前端网络请求
  • 面向对象(进阶)(‘封装‘,‘多态‘,‘对象属性‘,‘类属性‘,‘类方法‘,‘对象方法‘及其应用场景)
  • 糊涂人寄信——递推
  • 算法设计与分析——动态规划
  • KnowGPT知识图谱整合
  • 深入浅出理解LLM PPO:基于verl框架的实现解析之一
  • Java并发编程面试题:锁(17题)
  • c++ 数组索引越界检查
  • 解决 C 盘空间不足,免费软件高效清理
  • 佛山网站建设骏域网站建设专家/seo零基础教学
  • 网上做问卷调查网站/微信管理系统登录入口
  • 手机网站开发有前途/烟台seo快速排名
  • 在国外做网站/推广手段和渠道有哪些
  • pathon做网站/公司网站如何建设
  • 邢台企业做网站报价/网站目录提交