浅谈电商场景中的扣除库存问题

news2024/11/24 19:27:10

库存

  • 一、场景
  • 二、扣减时机
    • 1.下单时扣库存
    • 2.支付完成扣库存
    • 3.预扣除
  • 三、库存存储方案
    • 1.数据库存储
    • 2.数据库缓存混合存储
  • 四、整体方案
    • 1.单数据库方案
    • 2.主从数据库方案
    • 3.主从数据库缓存方案
    • 4.数据库缓存混合存储
  • 五、其他情况
    • 1.秒杀QPS过高
    • 2.Redis QPS过高
    • 3.Master DB QPS过高
    • 4.Master DB 单SKU库存过热
  • 总结


一、场景

现在网购变得非常普遍,各大网购平台除了正常售卖商品之外,还经常搞一些促销秒杀活动,这里涉及到电商的一个库存扣减概念。在电商的实际生产环境中,同一时间会有很多客户在浏览商品和下单操作,订单中涉及的相同商品的库存需要保证库存扣除的顺序性并且不能出现超卖的情况。

二、扣减时机

用户整个购物流程经过浏览商品、添加到购物车、下单、支付、退单等操作,其中有一些操作会涉及到商品库存的改动。针对库存扣减主要有下单时扣减、支付后扣减、预扣减等三种方式。

1.下单时扣库存

用户下单时就进行扣减商品库存操作。

  • 优点:用户体验好,只要下一步支付成功即可;系统逻辑简单,不涉及数据不一致情况;
  • 缺点:恶意下单或者下单后不支付,容易挤占库存;高并发或秒杀场景,对数据库访问压力大;

2.支付完成扣库存

用户支付完成后进行扣减商品库存操作。

  • 优点:可以有效避免库存被挤占;
  • 缺点:用户体验差,完成支付时可能商品已售完;高并发或秒杀场景,对数据库访问压力大;

3.预扣除

用户下单时进行库存预扣除防止商品出现超卖,支付完成后进行真实商品库存的扣除。

  • 优点:用户体验好;可以避免库存挤占;高并发或秒杀场景,可以拦截请求,减少数据库访问压力;
  • 缺点:系统逻辑复杂,需要额外维护预扣除库存,需要维护与真实库存的数据一致性;

考虑到用户体验、防止超卖、系统响应速度;并且需要满足秒杀和抢购等业务场景,扣库存的方式需要选择预扣除方式。

三、库存存储方案

商品的库存数据需要持久化并且需要尽可能保证访问性能,目前基本采用数据库存储或者数据库缓存混合方案。

1.数据库存储

采用数据库来存储商品库存数据。可以采用分表的形式将多个商品库存保存到不同的表中,提高访问效率和请求并发量。也可以采用主从部署模式来分担读请求压力,但是这种情况由于同步延迟,有超卖风险。

2.数据库缓存混合存储

采用数据库来存储商品库存数据,缓存中也保存商品库存数据。由于缓存可以支持高并发的访问,在高并发和秒杀场景时,可以先访问缓存中库存数据进行库存校验,将拦截无效情况,减轻对数据库访问压力。

四、整体方案

整个扣库存流程需要进行库存校验、库存扣减、创建订单、库存流水记录、退库存等,还需要考虑整体的事务性。

1.单数据库方案

整体流程如图,其中校验库存为读取数据库中库存数据不会进行数据的更改;扣库存、创订单和记流水三个步骤是通过数据库的事务性来保证。

  • 优点:部署成本低、逻辑简单;
  • 缺点:校验库存读流量导致主库读压力大。
    在这里插入图片描述

2.主从数据库方案

为了减轻主库的读压力,将单库升级为主从架构。校验库存时读取从数据库库存数据。

  • 优点:读写分离,分担主库读压力
  • 缺点:由于主从同步有一定延迟,导致校验库存不完全准确。会导致部分流量进行创单尝试,由于读取的是主库数据,所以不会有问题。
    在这里插入图片描述

3.主从数据库缓存方案

以上方案虽然引入了从库分担压力,但是面对秒杀万级QPS流量,还是会导致DB崩溃。所以引入redis缓存用于读取库存数据,将DB中数据实时同步到redis缓存中;此方案提供了高性能的校验库存和创单过程的事务性,可以很好的应对秒杀等场景。
在这里插入图片描述

4.数据库缓存混合存储

以上的方案扣库存都是针对数据库中保存的库存数据,校验的库存数据会有一定延迟,会导致无法拦截部分无效请求。此方案中可以在缓存中保存一份库存数据,在进行数据库操作之前,对缓存中库存数据进行扣减。可以保证缓存中库存数据的实时性,但是会导致缓存中和数据库中的库存数据不一致,因此需要引进对账机制定时保证数据的一致性。

  • 事务性
    如果校验库存从缓存扣库存成功,但是DB操作失败,这种情况会导致缓存中库存少于DB中库存,所以需要定时对账保证数据一致性。
  • Redis操作一致性
    由于订单中可能有多种商品,因此需要利用lua脚本把多条命令打包在一起,保证扣减库存的原子性操作。
    在这里插入图片描述

五、其他情况

1.秒杀QPS过高

秒杀场景超高QPS,此种情况可以考虑在校验库存之前进行限流操作。

2.Redis QPS过高

如果Redis QPS过高,可以引入缓存集群,将不同商品的SKU尽量均匀分布到多Redis节点中。

3.Master DB QPS过高

如果主数据库 QPS过高,可以考虑引入消息队列,经过前置校验后,可以把请求发送到消息队列,订单系统从消息队列中进行消费,创建订单。此方案有一定延迟性。

4.Master DB 单SKU库存过热

可以将Sku库存拆分成多份,放在不同的库表中,可以有效减轻扣减库存压力。

总结

电商场景中扣库存需要考虑秒杀高并发、事务一致性等场景,需要根据业务和场景来选择不同的方案。


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

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

相关文章

java生态环境评价Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 生态环境评价管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysq…

【sgCreateTableColumn】自定义小工具:敏捷开发→自动化生成表格列html代码(表格列生成工具)[基于el-table-column]

源码 <template><!-- 前往https://blog.csdn.net/qq_37860634/article/details/136126479 查看使用说明 --><div :class"$options.name"><div class"sg-head">表格列生成工具</div><div class"sg-container"…

问题:人的安全知识和技能是天生的。() #媒体#知识分享#学习方法

问题&#xff1a;人的安全知识和技能是天生的。&#xff08;) 人的安全知识和技能是天生的。() 参考答案如图所示 问题&#xff1a;&#xff08;&#xff09;是党和国家的根本所在、命脉所在&#xff0c;是全国各族人民的利益所在、幸福所在。 A.人民当家作主 B.坚持和完善…

Crypto-RSA3

题目&#xff1a;&#xff08;BUUCTF在线评测 (buuoj.cn)&#xff09; 共模攻击 ​ 前提&#xff1a;有两组及以上的RSA加密过程&#xff0c;而且其中两次的m和n都是相同的&#xff0c;那么就可以在不计算出d而直接计算出m的值。 ​ 设模数为n&#xff0c;两个用户的公钥分别为…

JavaScript中什么是事件委托

JavaScript 中的事件委托&#xff08;Event delegation&#xff09;是一种重要的编程技术&#xff0c;它能够优化网页中的事件处理&#xff0c;提高程序的性能和可维护性。本文将详细介绍事件委托的概念、工作原理&#xff0c;并提供示例代码来说明其实际应用。 事件委托是基于…

ARM编译器5.06下载安装

ARM编译器5.06下载安装 1.官网下载 进入官方网站ARM Complier v5.06官网下载页面 进入后的界面为 往下翻&#xff0c;找到如图位置的5.06 for windows的文件&#xff0c;点击下载&#xff0c;下载时需要登录账号 2.安装 先解压下载的压缩文件&#xff0c;在installer文件夹里…

英文单词-计算: calculate、count、compute、reckon

英文单词-计算: calculate、count、compute、reckon count 数数; 计算总数; 重要; 包括在内; 正式认可; 认为; 被视作; compute 计算&#xff0c;估算; calculate 计算; 估算; 估计; 预料; reckon 测算&#xff0c;估计; 认为; 计算; 评定&#xff0c;断定; 这四个单词 “c…

文件管理大师:深入解析Linux的文件与目录操控

目录 一、文件命名规则 1、可以使用哪些字符? 2、文件名的长度 3、Linux文件名大小写 4、Linux文件扩展名 二、文件管理命令 1、目录创建/删除 mkdir创建目录 直接创建文件夹 创建多个文件夹 递归创建写法 总结mkdir 删除空目录 2、文件创建、删除 touch创建文…

数解 transformer 之 self attention transformer 公式整理

千万不要从任何角度轻看 transformer&#xff0c;重要的话说四遍&#xff1a; 千万不要从任何角度轻看 transformer 千万不要从任何角度轻看 transformer 千万不要从任何角度轻看 transformer Attention is all you need 整个项目是鬼斧神工之作&#xff0c;巧夺天工之作&a…

C语言程序设计(第四版)—习题7程序设计题

目录 1.选择法排序。 2.求一批整数中出现最多的数字。 3.判断上三角矩阵。 4.求矩阵各行元素之和。 5.求鞍点。 6.统计大写辅音字母。 7.字符串替换。 8.字符串转换成十进制整数。 1.选择法排序。 输入一个正整数n&#xff08;1&#xff1c;n≤10&#xff09;&#xf…

SpringBoot RabbitMQ收发消息、配置及原理

今天分析SpringBoot通过自动配置集成RabbitMQ的原理以及使用。 AMQP概念 RabbitMQ是基于AMQP协议的message broker&#xff0c;所以我们首先要对AMQP做一个简单的了解。 AMQP (Advanced Message Queuing Protocol) is a messaging protocol that enables conforming client a…

Springmvc 的参数绑定之list集合

标签中name属性的值就是pojo类的属性名 参数绑定4 list [对象] <form action"teaupd.do" method"post"> <c:forEach items"${list}" var"tea" varStatus "status"> 教师编号&#xff1a;<input…

大模型专题:2023爱分析·大模型厂商全景报告

今天分享的是大模型系列深度研究报告&#xff1a;《大模型专题&#xff1a;2023爱分析大模型厂商全景报告》。 &#xff08;报告出品方&#xff1a;爱分析&#xff09; 报告共计&#xff1a;80页 研究范围定义 大模型是指通过在海量数据上依托强大算力资源进行训练后能完成…

统计图环形图绘制方法

统计图环形图绘制方法 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图环形图绘制较难。 在网上看到一种类很有艺术感的环形图图例&#xff0c;一时手痒也就搞了一个绘制方法。 本方法采用C语言的最基本功能&…

每日OJ题_算法_递归④力扣24. 两两交换链表中的节点

目录 ④力扣24. 两两交换链表中的节点 解析代码 ④力扣24. 两两交换链表中的节点 24. 两两交换链表中的节点 难度 中等 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即…

08-静态pod(了解即可,不重要)

我们都知道&#xff0c;pod是kubelet创建的&#xff0c;那么创建的流程是什么呐&#xff1f; 此时我们需要了解我们k8s中config.yaml配置文件了&#xff1b; 他的存放路径&#xff1a;【/var/lib/kubelet/config.yaml】 一、查看静态pod的路径 [rootk8s231 ~]# vim /var/lib…

【网工】华为设备命令学习(防火墙)

实验目的PC1连接到外网。 关于防火墙的其他知识后续补充。 ensp里的防火墙 用户名admin 密码Admin123 防火墙的接口类型 1.路由模式 物理口可以直接配. ​​​​​2.交换模式 物理口不能直接配IP&#xff0c;类似交换机&#xff0c;可以配vlan 首先我们先要对各个设备进…

前端开发:Vue框架与前端部署

Vue Vue是一套前端框架&#xff0c;免除原生)avaScript中的DOM操作&#xff0c;简化书写。是基于MVVM(Model–View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上。简单来说&#xff0c;就是数据变化的时候, 页面会自动刷新, 页面变化的时…

Crypto-RSA2

题目&#xff1a;&#xff08;BUUCTF在线评测 (buuoj.cn)&#xff09; 已知e,n,dp/(dq),c求明文: 首先有如下公式&#xff1a; dp ≡ d mod (p-1) &#xff0c;ed ≡ 1 mod φ(n) &#xff0c;npq &#xff0c;φ(n)(p-1)(q-1) python代码实现如下&#xff1a; import libnu…

npm报错之package-lock.json found. 问题和淘宝镜像源过期问题

1、package-lock.json found. 问题的解决 在执行yarn add react-transition-group -S 安装react-transition-group时出现package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in orde…