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月前
|
存储 供应链 监控
1688商品数据实战:API搜索接口开发与供应链分析应用
本文详细介绍了如何通过1688开放API实现商品数据的获取与应用,涵盖接入准备、签名流程、数据解析存储及商业化场景。开发者可完成智能选品、价格监控和供应商评级等功能,同时提供代码示例与问题解决方案,确保法律合规与数据安全。适合企业开发者快速构建供应链管理系统。
|
2天前
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
|
1月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
1月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
64 11
|
11天前
|
存储 安全 Java
Java 集合框架详解:系统化分析与高级应用
本文深入解析Java集合框架,涵盖List、Set、Map等核心接口及其常见实现类,如ArrayList、HashSet、HashMap等。通过对比不同集合类型的特性与应用场景,帮助开发者选择最优方案。同时介绍Iterator迭代机制、Collections工具类及Stream API等高级功能,提升代码效率与可维护性。适合初学者与进阶开发者系统学习与实践。
39 0
|
25天前
|
人工智能 JSON Java
列表结构与树结构转换分析与工具类封装(java版)
本文介绍了将线性列表转换为树形结构的实现方法及工具类封装。核心思路是先获取所有根节点,将其余节点作为子节点,通过递归构建每个根节点的子节点。关键在于节点需包含 `id`、`parentId` 和 `children` 三个属性。文中提供了两种封装方式:一是基于基类 `BaseTree` 的通用工具类,二是使用函数式接口实现更灵活的方式。推荐使用后者,因其避免了继承限制,更具扩展性。代码示例中使用了 Jackson 库进行 JSON 格式化输出,便于结果展示。最后总结指出,理解原理是进一步优化和封装的基础。
|
2月前
|
数据采集 JSON Java
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
|
2月前
|
数据采集 存储 Java
Java爬虫获取微店店铺所有商品API接口设计与实现
本文介绍如何使用Java设计并实现一个爬虫程序,以获取微店店铺的所有商品信息。通过HttpClient发送HTTP请求,Jsoup解析HTML页面,提取商品名称、价格、图片链接等数据,并将其存储到本地文件或数据库中。文中详细描述了爬虫的设计思路、代码实现及注意事项,包括反爬虫机制、数据合法性和性能优化。此方法可帮助商家了解竞争对手,为消费者提供更全面的商品比较。
|
2月前
|
数据采集 算法 Java
如何在Java爬虫中设置动态延迟以避免API限制
如何在Java爬虫中设置动态延迟以避免API限制
|
3月前
|
存储 Java 开发者
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
本文详细介绍了 Java 中 `toString()` 方法的重写技巧及其重要
128 10
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。