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.缓存中存储有效的减库存操作,队列减库存的的请求依次顺序执行数据库减库存、生成订单明细事务(操作),如小米。

目录
相关文章
|
21天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
14天前
|
Java 调度
Java中常见锁的分类及概念分析
Java中常见锁的分类及概念分析
15 0
|
14天前
|
Java
Java中ReentrantLock中tryLock()方法加锁分析
Java中ReentrantLock中tryLock()方法加锁分析
12 0
|
4天前
|
Java API Apache
ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)
【4月更文挑战第11天】ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)
23 11
|
6天前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
6天前
|
消息中间件 存储 安全
从零开始构建Java消息队列系统
【4月更文挑战第18天】构建一个简单的Java消息队列系统,包括`Message`类、遵循FIFO原则的`MessageQueue`(使用`LinkedList`实现)、`Producer`和`Consumer`类。在多线程环境下,`MessageQueue`的操作通过`synchronized`保证线程安全。测试代码中,生产者发送10条消息,消费者处理这些消息。实际应用中,可能需要考虑持久化、分布式队列和消息确认等高级特性,或者使用成熟的MQ系统如Kafka或RabbitMQ。
|
7天前
|
消息中间件 存储 Java
深度探索:使用Apache Kafka构建高效Java消息队列处理系统
【4月更文挑战第17天】本文介绍了在Java环境下使用Apache Kafka进行消息队列处理的方法。Kafka是一个分布式流处理平台,采用发布/订阅模型,支持高效的消息生产和消费。文章详细讲解了Kafka的核心概念,包括主题、生产者和消费者,以及消息的存储和消费流程。此外,还展示了Java代码示例,说明如何创建生产者和消费者。最后,讨论了在高并发场景下的优化策略,如分区、消息压缩和批处理。通过理解和应用这些策略,可以构建高性能的消息系统。
|
8天前
|
存储 安全 Java
说说Java 8 引入的Stream API
说说Java 8 引入的Stream API
12 0
|
8天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【4月更文挑战第16天】本文将介绍Java 8中的两个重要新特性:Lambda表达式和Stream API。Lambda表达式是Java 8中引入的一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁、易读。Stream API是Java 8中引入的一种新的数据处理方式,它允许我们以声明式的方式处理数据,从而使代码更加简洁、高效。本文将通过实例代码详细讲解这两个新特性的使用方法和优势。
|
9天前
|
监控 JavaScript 安全
构建微服务架构下的API网关
【4月更文挑战第15天】在微服务架构中,API网关扮演着至关重要的角色。它作为系统的唯一入口,不仅负责请求的路由、负载均衡和认证授权,还涉及到监控、日志记录和服务熔断等关键功能。本文将探讨如何构建一个高效且可靠的API网关,涵盖其设计原则、核心组件以及实现策略,旨在为后端开发人员提供一套实用的指导方案。
22 4