库存是电商系统的核心环节,如何做到不少卖,不超卖是库存关心的核心业务问题。业务量大时带来的问题是如何更快速的处理库存计算。 
此处以最简模式来讨论库存设计。 
以下内容只做分析,不能直接套用,欢迎各位同道前来交流指正 
库存模型: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与redis的更多相关文章

  1. Java生鲜电商平台-生鲜电商中商品类目、属性、品牌、单位架构设计与实战

    Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战 说明:Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战经验分享 凡是涉及到购物,必然是建立在商品的基础 ...

  2. Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

    Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...

  3. SpringBoot+Neo4j在社交电商中,讲述你是怎么被绑定为下线的

    上两篇文章我们主要讲解了Neo4j的基本知识以及Neo4j的基本使用,这篇文章我们就以实例来深入的理解一下,我们以社交电商中的绑定关系为例,使用SpringBoot+Neo4j来实现. Neo4j文章 ...

  4. Java生鲜电商平台-电商中"再来一单"功能架构与详细设计(APP/小程序)

    Java生鲜电商平台-电商中"再来一单"功能架构与详细设计(APP/小程序) 说明:在实际的业务场景中(无论是TO B还是TO C)不管是休闲食品.餐饮.水果.日用百货.母婴等高频 ...

  5. php 电商系统SKU库存设计

    sku 全称为:Stock Keeping Unit,是库存进出计量的基本单元. 我们一般会在电商网站基本都会看到 比如淘宝,JD 淘宝和JD的 方式可能不一样,因为我不清楚他们具体是如何设计的, J ...

  6. REDIS 在电商中的实际应用场景(转)

    1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc),Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等 ...

  7. Redis在电商中的实际应用-Java

    示例代码用Jedis编写. 1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc),Redis的命令都是原子性的,你可以轻 ...

  8. Java架构师系统培训高并发分布式电商实战activemq,netty,nginx,redis dubbo shiro jvm虚拟机视频教程下载

    15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 ...

  9. Flutter实战视频-移动电商-24.Provide状态管理基础

    24.Provide状态管理基础 Flutter | 状态管理特别篇 —— Provide:https://juejin.im/post/5c6d4b52f265da2dc675b407?tdsour ...

随机推荐

  1. Python中的装饰器的简单介绍02

    这篇博文转载自伯乐在线的12步轻松搞定python装饰器,重构成python3. 1. 函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字返回值.我们举例 ...

  2. delete 与 delete []

    /* Module: delete与delete[]的区别.cpp Notices: Copyright (c) 2017 Landy Tan */ #include <iostream> ...

  3. Ubuntu16.04+CUDA8.0+cuDNN5.1+Python2.7+TensorFlow1.2.0环境搭建

    软件版本说明:我选的Linux系统是Ubuntu16.04,CUDA用的8.0,Ubuntu16.04+CUDA8.0+cuDNN5.1+Python2.7只支持TensorFlow1.3.0以下的版 ...

  4. python基础--列表、元祖、字典、集合

    列表(List) 1.列表特点 列表是可变的!! list 是一种有序的序列,可以添加.删除其中的元素,并且可以通过下标(索引)访问 数据 2.简单的常用操作 A.通过下表访问元素 print(lis ...

  5. cocos2dx为Sprite添加触摸事件监听器

    1.首先头文件定义事件处理的函数原型 private: bool onTouchBegan(Touch* tTouch,Event* eEvent);//手指按下事件 void onTouchMove ...

  6. ccf-棋局评估-20190304

    三更:  更短的代码,更短的时间,加油! 也祝你好运哦!!!! 核心: dfs(player)  player下完之后最大得分 优点: 我位运算掌握的还不错嘛 2和1如何转换  2^3=1; 1^3= ...

  7. Python导入jar包

    一.环境准备 1.Python 3.6 64位+jre 64位+win64位(jre和Python位数一致) 2.安装jpype,安装的时候输入 pip install jpype1 2.1安装提示e ...

  8. 2018.4.28 kvm虚拟机管理

    创建虚拟机: virt-install --name wj-v1.4.1.0411 --vcpus=2 --memory=2048 --disk path=/home/wj/os/osgwV1.4.1 ...

  9. 421. Maximum XOR of Two Numbers in an Array

    这题要求On时间复杂度完成, 第一次做事没什么思路的, 答案网上有不贴了, 总结下这类题的思路. 不局限于这个题, 凡是对于这种给一个  数组,  求出 xxx 最大值的办法, 可能上来默认就是dp, ...

  10. Python调用ffpmeg和ffprobe处理视频文件

    需求: 运营有若干批次的视频.有上千个,视频文件,有mp4格式的,有ts格式的 现在有需要去掉视频文件片头和片尾的批量操作需求. 比如 文件夹A下面的视频去掉片尾10秒 文件夹B下面的视频去掉片头6秒 ...