库存是电商系统的核心环节,如何做到不少卖,不超卖是库存关心的核心业务问题。业务量大时带来的问题是如何更快速的处理库存计算。

此处以最简模式来讨论库存设计。

以下内容只做分析,不能直接套用,欢迎各位同道前来交流指正

库存模型:sku,num。

sku是标示商品的唯一编号,num是商品的数量。

订单处理时需扣减商品库存。

mysql实现

库存初始数据:

mysql隔离级别READ-COMMITTED

扣减1001库存7:

10-7=3;

3>0;

开始扣减库存

UPDATE stock SET num=3 WHERE sku=1001;

在串行执行情况下以上逻辑是正确的处理方式。

如果是并发执行,可能会出现这种情况:

10-7=3;

库存在另外一个线程中被修改为5

UPDATE stock SET num=3 WHERE sku=1001;

库存最终被修改为3

一共卖出5+7=12个商品,实际总商品数是10,超卖发生。

为解决超卖引入如下方案:

10-7=3;

3>0;

开始扣减库存

库存在另外一个线程中被修改为5

UPDATE stock SET num=num-7 WHERE num>=7 AND sku=1001;

update失败,超卖解决。

考虑到订单的商品有多个,那在并发执行的情况下是否还是正常呢?

现有订单1,订单2同时处理,都是1001扣减库存5,1002扣减库存10

订单1:

UPDATE stock SET num=num-5 WHERE num>=5 AND sku=1001;

UPDATE stock SET num=num-10 WHERE num>=10 AND sku=1002;

订单2:

UPDATE stock SET num=num-10 WHERE num>=10 AND sku=1002;

UPDATE stock SET num=num-5 WHERE num>=5 AND sku=1001;

若sql执行情况是订单1先修改1001,订单2修改1002,这个时候产生死锁,有一个订单必然会失败。

少卖发生。

如果是订单2中第二个商品是1003会怎么样呢?

两个订单的库存修改会变成串行执行。

这种情况下会带来性能下降的问题,事务超时的时候会发生多个订单失败的情况。

多个订单失败后如果订单依然要处理,此时库存没有扣减,又会发生超卖。

结论:mysql可以保证数据一致性和持久性,但是性能不高,在量级较高的情况下库存并没有控制好少卖超卖的情况。

redis实现

mysql的缺点是如此显而易见,为了解决这个问题,现在引入redis。

redis的读写速度快,数据操作都在内存中运行,性能必然比mysql高。

string类型提供了decrby方法,可以以原子方式对string做减法。

对1001库存减5:

decrby 1001 5

获得返回值,如果小于0则执行

incrby 1001 5

并且所有相关数据回滚

在多线程环境中会有多个订单同时回滚,库存充足的情况。产生这种现象后,失败的订单可以留待下次再行处理。

但是库存的值并不能用来做实时计算,因为失败订单的库存没有进行计算。

redis没有事务,无法保证数据一致性。

结论:redis解决了性能问题,但是数据一致性无法保证。

其它

为解决mysql问题,可以结合异步定时扣减库存,队列做。

最后,不管用mysql还是redis 都各有优缺点.

mysql怎么做库存管理_电商中的库存管理实现-mysql与redis相关推荐

  1. 电商扣减库存_电商后台:商品库存管理之批次管理

    本文主要对电商平台的库存系统中的批次管理进行了详细的阐述,一起来看看~ 一.批次管理 库存,是电商企业不能回避的问题,如何让仓库商品能够有序的流转,是电商供应链管理后台的重中之重,也是电商企业的命门. ...

  2. 电商扣减库存_电商新零售库存分层模型介绍

    01 电商新零售库存分层 梳理完中央库存的逻辑以后,下一步需要整理上下游的库存交互.在整个电商体系中,库存会存在于供应链的多个业务环节中,按照系统的分工不同,小Q将库存抽象为两类三层: 1.两类库存: ...

  3. mysql表设计 不同价格_电商网站商品详情页,要能选择商品属情如大小,颜色,型号等,对应不同价格,数据库应该如何设计?...

    首先电商中的商品信息存储至少要2个表,第一张表:商品的基本信息,这个信息是在你刚进入商品 详情页面看到的数据,而你选择了商品规格(尺码,颜色等),此时展示的商品信息为具体的商品 下的规则信息,我们称之 ...

  4. 电商库存设计mysql redis_电商中的库存管理实现-mysql与redis

    库存是电商系统的核心环节,如何做到不少卖,不超卖是库存关心的核心业务问题.业务量大时带来的问题是如何更快速的处理库存计算. 此处以最简模式来讨论库存设计. 以下内容只做分析,不能直接套用,欢迎各位同道 ...

  5. java 电商锁库存实现_电商项目扣减库存方案

    阿里巴巴b2b电商算法实战电子商务 85.3元 包邮 (需用券) 去购买 > 各位小宝贝们,大家是不是在面试过程中经常被问到,你电商项目扣减库存时,到底是下单减库存呢?还是付款减库存? 那今天给 ...

  6. rbac 一个用户对应多个账号_电商后台系统:管理后台之账号管理(一)

    系统管理模块顾名思义,是对整个系统的设置和管理,是后台里面比较高的一个权限,一般只有少数管理员才会拥有.本文主要说明管理后台系统的系统管理模块. 后台产品最主要的是要理解业务,然后根据业务去梳理流程和 ...

  7. C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...

    在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接. 一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列. 当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队 ...

  8. 天翎携手群晖助力电商行业文档管理

    编者按:电商行业的文档管理怎么做?本文根据电商行业文档管理中存在的一些难点,提出天翎文档管理系统和群晖NAS结合的解决方案. 关键词:免安装,免维护,文件分类,权限设置,文件同步,在线编辑,在线预览 ...

  9. 电商扣减库存_经验分享:电商库存体系设计笔记

    最近在做仓库库存管理相关的项目,清晰地了解了仓库是如何管理库存的,并且整清楚了各个系统的库存是如何交互的,整理了下分享给大家. 库存是什么 这里是百度百科给出的解释: "库存(invento ...

最新文章

  1. notepad++的好用快捷键整理
  2. 不要和Java“结婚”
  3. form select multiple 某个字段是数组_Hive取非Group by字段数据的方法
  4. iOS之单例模式的写法
  5. mongodb创建用户名和密码_Python中使用MongoDB详解
  6. 动态规划--重拾我的“背包”
  7. docker停止容器后配置_Docker 自学笔记 - april_aaa
  8. 数学发展史中最重要的4个阶段
  9. Linux下实现一个网卡绑定多个IP地址
  10. java简历模板百度网盘,再不了解你就out啦
  11. IOS性能优化之一些常见的性能指标
  12. 人民币金额大写转小写
  13. python 英语词频统计_Python实现统计英文文章词频的方法分析
  14. vue-element-admin 项目更换浏览器图标与标头
  15. 木讷的程序员需要知道的事情 (六)
  16. 数仓建模—元数据管理
  17. Nginx常用知识梳理(三)——windows环境下端口耗尽问题
  18. 2016年最受注目的网络技术关键词预测
  19. vin接口车架号vin查询车型
  20. 锐捷 linux无法上网,通过锐捷认证了,为什么还不能上网?

热门文章

  1. iOS--上传AppStore时遇到的10个大坑
  2. java根据出生日期计算年龄_Java 根据出生日期获得年纪
  3. linux传奇私服文件包,传奇私服服务器端文件结构
  4. 18其他算法(algo)——单纯的数据处理
  5. 题目:python 打印出如下图案(菱形):
  6. 修改计算机桌面壁纸影响计算机考试吗,计算机考试
  7. Could not load file ‘/etc/sysconfig/network-scripts/ifcfg-lo‘
  8. PDF生成插件--TcPDF
  9. C编译报错: implicit declaration of function xxx is invalid in C99 [-Wimplicit-function-declaration]
  10. Ubuntu 18.04 锁屏 快捷键 无效