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

news2024/9/20 23:26:25

1 库存扣减

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

1.1 关键技术点

  • 同一个SKU,库存数量是共享

  • 剩余库存要大于等于本次扣减的数量,否则超卖

  • 对同一个数量多用户并发扣减时,要注意并发安全,保证数据的一致性

  • 类似于秒杀这样高QPS的扣减场景,要保证性能与高可用

  • 对于购物车下单场景,多个商品库存批量扣减,要保证事务

  • 如果有 交易退款 ,保证库存扣减可返还

    • 返还的数据总量不能大于扣减的总量
    • 返还要保证幂等
    • 可以分多次返还

1.2 数据库扣减

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

1.2.1 依赖的数据库特性

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

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

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。

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

考虑数据库架构升级:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/22007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go 协程与Channel管道

风离不摆烂学习日志 Day2 GO 协程 结论: 主线程是一个物理线程,直接作用在cpu上。是重量级的,非常耗费cpu资源。 协程是从主线程开启的,是轻量级的线程,是逻辑态。对资源消耗相对小。 Golang的协程机制是重要的特点&…

OpenStreetMap:对抗谷歌帝国的共享开源地图

OpenStreetMap:对抗谷歌帝国的共享免费地图 讲在前面 在步入自动驾驶的学习之后,不可避免地我需要去了解在驾驶领域中选择的地图格式,而随着研究的进一步深入,我逐步了解到两种较为主流的自动驾驶地图格式,分别是Open…

[附源码]计算机毕业设计JAVA基于JSP的美妆购买网站

[附源码]计算机毕业设计JAVA基于JSP的美妆购买网站 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM m…

虚拟机的安装搭建centos7.9.2009

这里写目录标题虚拟机的安装搭建1. 虚拟机镜像版本下载 centos7.9.20092. 虚拟机 vmware 17pro(专业版) 版本下载及安装配置1.2.1 虚拟机 vmware 17pro下载1.2.2 虚拟机 vmware 17pro 安装1.2.3 虚拟机 vmware 17pro 配置1.2.4 安装配置centos7操作系统&…

Arthas的使用与进阶

Arthas的使用与进阶Arthas使用与进阶一、概述二、快速安装windows下安装arthasLinux下安装arthas卸载在Linux/Unix/Mac平台Windows平台三、快速入门:attach一个进程1、准备2、启动arthas四、快速入门:常用命令接触命令介绍1、dashboard仪表板2、通过Thre…

Servlet小项目 | 基于纯Servlet手写一个单表的CRUD操作

使用纯粹的Servlet完成单表【对部门的】的增删改查操作。(B/S结构的) 目录 一:设计数据库表及原型 二:动态实现部门列表及详情页 三:实现部门删除功能 四:实现部门新增功能 五:实现部门修…

NJUPT算法分析与设计期末考试2021.11.24

NJUPT算法分析与设计期末考试2021.11.24判断简答1.算法是什么?算法的时间复杂度是什么?衡量的原则,标准,工具2.分支限界法扩展活节点的方式有哪两种,有什么差别?3.回溯法搜索子集树,排列树的算法…

PostgreSQL下载和安装教程

PostgreSQL下载和安装嘚吧嘚下载安装配置pgAdmin设置中文安装中遇到的问题The database cluster initialisation failed.问题描述解决方法嘚吧嘚 公司在用PostgreSQL数据库,和MySQL一样是免费试用的。虽然不知道公司出于什么考虑没有选择MySQL,而是选用…

【户外】东莞-银瓶山-常规路线-登山游记+攻略

不想看流水的请直接看最后攻略 此次路线:北上南下。累计行走约11.57km. 2022/11/20 周日 东莞最近YQ严重,不是拉去Jiankang驿站,就是居家GeLi,加上工作也郁闷,出去走走。 昨晚两点睡觉,在给各种设备补电量…

qq录屏快捷键是什么?qq录屏声音设置

我们日常生活中,有时会突然遇到需要用电脑录制屏幕的情况,这个时候我们可以通过按下qq录屏的快捷键进行录屏。有些小伙伴就有疑问了,电脑qq录屏快捷键是什么? qq录屏声音如何设置?别急,接下来小编给大家详细…

SpringMVC跳转

转发: 1:添加成功跳转到成功页面,给出提示,失败跳转到失败页面 ---- jsp 2:添加成功后,跳转到查询的controller中 -- 另外一个程序,添加完成之后,执行查询所有的操作&#xff0c…

Linux环境基础开发工具使用

Linux环境基础开发工具使用 文章目录Linux环境基础开发工具使用1.Linux软件包管理器 yum1.1 什么是软件包1.2 了解rzsz(文件传输工具)1.3 查看软件包1.4 安装与卸载软件指令1.5 更新yum源2.Linux开发工具介绍2.1 vi/vim开发工具介绍2.2 vi/vim的按键图解3.Linux编辑器---vim的使…

数字信号处理 | 实验二 MATLAB z换和z逆变换分析+求解差分方程+求解单位冲击响应+求解幅频相频特性曲线+求解零极点

1.实验目的 (1)掌握离散时间信号的z变换和z逆变换分析 (2)掌握MATLAB中利用filter函数求解差分方程; (3)掌握MATLAB中利用impz函数求解单位冲击响应h(n); (4)掌握MATLAB中利用freqz函数求解幅频特性曲线和相频特性曲线; (5)掌握MATLAB中利用zplane函…

Spring事务管理 | 数据库连接池流程原理分析

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 文章目录▌Spring事务管理环境搭建标准配置声明式事务总结▌SqlSessionFactoryXML 中构建 SqlSessionFactory获得 SqlSession 的实例代码实现▌作用域(Sco…

2022.11.20 学习周报

文章目录摘要论文阅读1.题目2.摘要3.网络结构3.1 网络示意图3.2 网络特点4.问题的提出5.正则化带有LSTM单元的RNNs5.1 LSTM单元5.2 具有 Dropout 的正则化6.实验6.1 语音建模6.2 语音识别6.3 机器翻译6.4 图像字幕生成7.结论深度学习Pytorch实现简单的RNN总结摘要 This week, …

总账科目 前台操作关事务代码及操作要点

目录 1、维护会计科目相关代码及要点 2、公司代码中的科目参数详解 1、维护会计科目相关代码及要点 事务代码:FSP0 在科目表中维护科目 操作例子:创建1001010100 现金-人民币 及40010001实收资本. 点保存后成功展示如下图 注意,后台必须的…

treeSelect树组件设置父节点禁用

前言: 项目开发中需求方提了这样一个需求:下拉框数据是树形结构,但父节点禁止点选,只能点击子节点。毫无疑问,选用的是 ant design vue 组件库的 treeSelect 组件。但该组件默认每一级节点都可以进行选择,…

Vagrant+VirtualBox快速搭建Linux环境

VagrantVirtualBox快速搭建Linux环境虚拟机Oracle VM VirtualBoxVMware虚拟机的选择Vagrant介绍Vagrant安装centos7虚拟机固定ip配置允许账号密码登录Xshell 连接Vagrant生成的虚拟机虚拟机 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功…

通过docker部署grafana和mysql

1. 简介2. 网络设置 - 2.1 docker网络设置 - 2.2 防火墙设置3. MySQL - 3.1 启动MySQL - 3.2 配置mysql - 3.3 创建只读用户 - 3.4 创建数据库4. Grafana - 4.1 启动Grafana - 4.2 配置数据源 - 4.3 dashboard与panel5. 参考 1. 简介 grafana是一个数据可视化程序, 可通过浏览…

python gdal geopandas basemap cartopy安装

python彻底解决Basemap cartopy geopandas 安装问题 Basemap cartopy geopandas rasterio这几个库存在一定的依赖关系,由于环境的变化 很可能哪天不知道就报错了: 版本不一致,运行也可能报错,如GDAL3.0的主要变化在于对空间参考…