Java并发编程程序员

Java高并发秒杀Api-业务分析与DAO层构建1

2018-05-04  本文已影响51人  markfork

章节目录

1.为什么使用Spring+Spring MVC+Mybatis

2.秒杀业务特性

3.相关技术介绍

4.基于Maven创建项目

1.maven命令创建web项目骨架

mvn archetype:generate -DgroupId=org.seckill -DartifactId=seckill -
DarchetypeArtifactId=maven-archetype-webapp

5.秒杀业务分析

如下图所示:


秒杀业务系统流程分析

所以秒杀业务的核心是对库存的处理。

用户针对库存处理的业务分析
用户的秒杀过程

需要减库存->记录购买明细->组成完整事务->数据持久化
如下图所示:

用户秒杀过程

用户购买行为

记录谁购买成功了->成功的时间及有效期->付款、发货信息

为什么需要事务

事务不完整导致的数据一致性问题
如上图所示
1.减了库存,但是没有用户的购买明细,那么就会出现50个商品,但是购买明
细小于50个,到时候发货会发现有些许商品滞留在仓库中,此种情况属于少卖
的情况。
2.记录了明细但是没有减库存,就会发现订单量比商品量要多,出现超卖的情
况,还有一种情况也会导致超卖,多个用户并发修改库存,加入库存量为1,这
个时候多个用户同时去减库存(经过库存量>0的验证),会导致库存为负数,
多个用户抢到同一个商品,这种情况下也会导致超卖发生。

数据落地方案
MySQL VS NoSQL
NoSQL非关系型数据库在事务的支持上并没有关系型数据库可靠。
所以归根结底事务机制依然是目前最可靠的落地方案。

6.秒杀事务难点分析

6.1 难点问题-竞争

竞争问题-并发冲突修改
解决方案是采用数据库innodb引擎提供的事务行级锁
在事务执行过程中,mysql默认的repeateable read 隔离级别会在写操作发生的
行上加上行级锁(非记录加锁,而是在对应索引上加锁,上图中的update加锁
发生在id上),多个写请求并发更新同一行记录会产生如下问题:
因为行级锁在事务结束之后才能释放锁,可能会导致锁等待的发生。数据库吞吐率(事务处理能力)会降低。

所以秒杀的难点是什么?
秒杀的难点是如何高效的处理竞争-如何在保证数据一致性的情况下高效的处理竞争

8.实现秒杀的哪些功能

其实市面上最主要的几个秒杀思路是:

1.直接在数据库层面做秒杀
2.缓存中存储库存,用户秒杀请求是将缓存中库存与数据库中库存数据同时进行减库存的过程,保证数据一致性是一个难点。
3.缓存中存储有效的减库存操作,队列减库存的的请求依次顺序执行数据库减库存、生成订单明细事务(操作),如小米。

上一篇下一篇

猜你喜欢

热点阅读