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

简介: 章节目录1.为什么使用Spring+Spring MVC+Mybatis2.秒杀业务特性3.秒杀分析过程、优化思路4.相关技术介绍5.基于Maven创建项目6.

章节目录

  • 1.为什么使用Spring+Spring MVC+Mybatis
  • 2.秒杀业务特性
  • 3.秒杀分析过程、优化思路
  • 4.相关技术介绍
  • 5.基于Maven创建项目
  • 6.秒杀业务分析
  • 7.秒杀事务的难点分析
  • 8.实现秒杀的哪些功能

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

  • 框架易于使用、轻量级
  • 对业务代码侵入性低
  • 成熟的社区与资料

2.秒杀业务特性

  • 秒杀业务场景具有典型的"事务"特性
  • 秒杀、红包类需求越来越常见,对竞争资源的访问
  • 面试常问的问题

3.相关技术介绍

  • MySQL
    • 表设计
    • SQL技巧
    • 事务、行级锁
  • MyBatis
    • DAO层设计与开发
    • MyBatis 合理使用
    • MyBatis 与 Spring整合
  • Spring
    • Spring Ioc 整合Service
    • Spring 声明式事务使用
  • Spring MVC
    • Restful 接口设计与使用
    • 框架运作流程
    • Controller 设计技巧
  • 前端
    • 交互设计
    • BootStrap
    • Jquery
  • 高并发
    • 高并发点和高并发分析
    • 优化思路并实现

4.基于Maven创建项目

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

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

5.秒杀业务分析

如下图所示:


img_99c227e45431653ad467b929720cb9c6.png
秒杀业务系统流程分析

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

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

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

img_13ac25ab4051a03aa5c30547d5fe40c2.png
用户秒杀过程

用户购买行为

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

为什么需要事务

img_c6f7bc86245a8dd40a310c87bc7ff224.png
事务不完整导致的数据一致性问题

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

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

6.秒杀事务难点分析

6.1 难点问题-竞争

img_fd1f2a76c9e7843bc4a0545c1b59c676.png
竞争问题-并发冲突修改

解决方案是采用数据库innodb引擎提供的 事务行级锁

  • 用户减库存的事务流程:
    begin;
    update 库存数量;
    insert 购买明细;
    commit;
    
  • 行级锁
    如下如所示:
    img_6d6bffe3e6a402e5d67cd386ecd6731a.png
    行级锁

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

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

8.实现秒杀的哪些功能

  • 1.秒杀接口暴露
    浏览器插件获取秒杀接口,通过脚本去秒杀,保护秒杀接口的一种手段。
  • 2.执行秒杀的操作
    执行秒杀的业务逻辑
  • 3.秒杀查询,商品详情页查询。

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

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

目录
相关文章
|
1天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
7 0
|
1天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
8 0
|
1天前
|
传感器 机器人 Java
使用Java构建机器人应用
使用Java构建机器人应用
5 0
|
1天前
|
安全 Java API
使用Java构建RESTfulWeb服务
使用Java构建RESTfulWeb服务
5 0
|
1天前
|
分布式计算 负载均衡 Java
构建高可用性Java应用:介绍分布式系统设计与开发
构建高可用性Java应用:介绍分布式系统设计与开发
7 0
|
5天前
|
缓存 NoSQL Java
构建高性能微服务架构:Java后端的实践之路
【5月更文挑战第5天】在当今快速迭代和高并发需求的软件开发领域,微服务架构因其灵活性、可扩展性而受到青睐。本文将深入探讨如何在Java后端环境中构建一个高性能的微服务系统,涵盖关键的设计原则、常用的框架选择以及性能优化技巧。我们将重点讨论如何通过合理的服务划分、高效的数据存储策略、智能的缓存机制以及有效的负载均衡技术来提升整体系统的响应速度和处理能力。
|
6天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【5月更文挑战第4天】在移动开发的世界中,性能一直是衡量应用质量的重要指标。随着Kotlin的兴起,许多Android开发者开始考虑是否应该从传统的Java迁移到Kotlin。本文通过深入分析两者在Android平台上的性能差异,帮助开发者理解Kotlin在实际项目中的表现,并提供选择编程语言时的参考依据。
20 5
|
7天前
|
Java Maven
Maven 构建 Java 项目
使用Maven的`maven-archetype-quickstart`插件在C:\MVN下创建Java应用,命令包括`groupId`, `artifactId`, 和 `archetypeArtifactId`参数。生成的项目包含src/main/java和src/test/java目录,分别用于存放源代码和测试代码,还有src/main/resources用于资源文件。默认提供App.java主类和AppTest.java测试类。按照预设结构组织文件,Maven将自动管理构建过程。
|
8天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第1天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的函数式编程语法,可以简化代码并提高可读性。Stream API是一种用于处理集合的新工具,可以方便地进行数据操作和转换。通过结合Lambda表达式和Stream API,我们可以更加简洁高效地编写Java代码。
|
9天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第1天】 在移动开发的世界中,性能优化始终是开发者关注的焦点。随着Kotlin的兴起,许多团队和开发者面临着一个选择:是坚持传统的Java语言,还是转向现代化、更加简洁的Kotlin?本文通过深入分析和对比Kotlin与Java在Android应用开发中的性能表现,揭示两者在编译效率、运行速度和内存消耗等方面的差异。我们将探讨如何根据项目需求和团队熟悉度,选择最适合的语言,以确保应用的高性能和流畅体验。

热门文章

最新文章