电商中的库存管理实现-mysql与redis
库存是电商系统的核心环节,如何做到不少卖,不超卖是库存关心的核心业务问题。业务量大时带来的问题是如何更快速的处理库存计算。
此处以最简模式来讨论库存设计。
以下内容只做分析,不能直接套用,欢迎各位同道前来交流指正
库存模型:sku,num。
sku是标示商品的唯一编号,num是商品的数量。
订单处理时需扣减商品库存。
mysql实现
库存初始数据:
mysql隔离级别READ-COMMITTED
扣减1001库存7:
10-7=3;
3>0;
开始扣减库存
UPDATEstock
SET num=3 WHERE sku=1001;
在串行执行情况下以上逻辑是正确的处理方式。
如果是并发执行,可能会出现这种情况:
10-7=3;
库存在另外一个线程中被修改为5
UPDATEstock
SET num=3 WHERE sku=1001;
库存最终被修改为3
一共卖出5+7=12个商品,实际总商品数是10,超卖发生。
为解决超卖引入如下方案:
10-7=3;
3>0;
开始扣减库存
库存在另外一个线程中被修改为5
UPDATEstock
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;
UPDATEstock
SET num=num-10 WHERE num>=10 AND sku=1002;
订单2:
UPDATE
stock
SET num=num-10 WHERE num>=10 AND sku=1002;
UPDATEstock
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的更多相关文章
- Java生鲜电商平台-生鲜电商中商品类目、属性、品牌、单位架构设计与实战
Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战 说明:Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战经验分享 凡是涉及到购物,必然是建立在商品的基础 ...
- Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析
Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...
- SpringBoot+Neo4j在社交电商中,讲述你是怎么被绑定为下线的
上两篇文章我们主要讲解了Neo4j的基本知识以及Neo4j的基本使用,这篇文章我们就以实例来深入的理解一下,我们以社交电商中的绑定关系为例,使用SpringBoot+Neo4j来实现. Neo4j文章 ...
- Java生鲜电商平台-电商中"再来一单"功能架构与详细设计(APP/小程序)
Java生鲜电商平台-电商中"再来一单"功能架构与详细设计(APP/小程序) 说明:在实际的业务场景中(无论是TO B还是TO C)不管是休闲食品.餐饮.水果.日用百货.母婴等高频 ...
- php 电商系统SKU库存设计
sku 全称为:Stock Keeping Unit,是库存进出计量的基本单元. 我们一般会在电商网站基本都会看到 比如淘宝,JD 淘宝和JD的 方式可能不一样,因为我不清楚他们具体是如何设计的, J ...
- REDIS 在电商中的实际应用场景(转)
1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc),Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等 ...
- Redis在电商中的实际应用-Java
示例代码用Jedis编写. 1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc),Redis的命令都是原子性的,你可以轻 ...
- Java架构师系统培训高并发分布式电商实战activemq,netty,nginx,redis dubbo shiro jvm虚拟机视频教程下载
15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 ...
- Flutter实战视频-移动电商-24.Provide状态管理基础
24.Provide状态管理基础 Flutter | 状态管理特别篇 —— Provide:https://juejin.im/post/5c6d4b52f265da2dc675b407?tdsour ...
随机推荐
- day059 ajax初识 登录认证练习
ajax初识 ajax有两个特点: 一个是异步,另一个是浏览器页面局部刷新(这个特点是用户感受不到的时候进行的) 示例: 页面输入两个整数,通过AJAX传输到后端计算结果并返回 在HTML文件中: & ...
- tensorFlow 零散知识
收集一些碰到的关于细节的函数在这里记录下 1.tf.flags.DEFINE_xxx() 读别人家的代码的时候经常看到这个,结果两三天不看居然忘记了,这脑子绝对上锈了,决定记下来免得老是查来查去的.. ...
- linux下使用命令修改IP地址
使用root用户登录进入Linux,打开进去终端 在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0 (最后的eth0是网卡名,我的是Auto_et ...
- Android开发 ---实现ListView的A-Z字母排序和过滤搜索功能
效果图: 1.activity.xml 描述: 线性布局中一个层叠布局 <?xml version="1.0" encoding="utf-8"?> ...
- 使用jsoup轻松爬数据
刚刚学习爬虫,感觉使用jsoup爬虫挺容易的.记录一下自己爬取数据的过程. Jsoup介绍: Jsoup 是一个 Java 的开源HTML解析器,可直接解析某个URL地址.HTML文本内容.使用Jso ...
- IntelliJ IDEA 如何生成时序图?
进入扩展程序安装 File > Settings > Plugins > Browse Repositories 搜索 SequenceDiagram,点击右边 Install 安装 ...
- java.io.IOException: Could not delete path 'D:\mycode\reactnative\SecondTest\android\app\build\generated\source\r \release\android\support\v7
问题解决 直观上看是没有删除某个文件,产生的IOException异常,实际上是因为上次编译导致的缓存没有清空导致的. 进入到android目录下运行下面代码清除上次打包时的缓存: ./gradlew ...
- C#修改json文件中的某些值
using Newtonsoft.Json; JsonSerializer serialiser = new JsonSerializer(); string newContent = string. ...
- JAVA高级篇(三、JVM编译机制、类加载机制)
一.类的加载过程 JVM将类的加载分为3个步骤: 1.装载(Load) 2.链接(Link) 3.初始化(Initialize) 其中 链接(Link)又分3个步骤,如下图所示: 1) 装载:查找并加 ...
- 【EMV L2】DDA标准动态数据认证处理流程
[标准动态数据认证DDA] 标准动态数据处理过程,除了动态签名由卡片生成以外,其他都是由终端执行的.处理过程: 1.认证中心公钥的获取终端使用认证中心公钥索引(PKI)以及卡片中的注册的应用提供商标识 ...