【三十】springboot项目上高并发解决示例

互相交流入口地址

整体目录:

【一】springboot整合swagger

【二】springboot整合自定义swagger

【三】springboot整合token

【四】springboot整合mybatis-plus

【五】springboot整合mybatis-plus

【六】springboot整合redis

【七】springboot整合AOP实现日志操作

【八】springboot整合定时任务

【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存

【十】springboot整合quartz实现定时任务优化

【十一】springboot整合异步调用并获取返回值

【十二】springboot整合WebService

【十三】springboot整合WebService关于传参数

【十四】springboot整合WebSocket

【十五】springboot整合WebSocket实现聊天室

【十六】RabbitMQ基础篇(下载安装并基础使用,内含各种坑问题)

【十七】RabbitMQ基础篇(延迟队列和死信队列实战)

【十八】springboot实现自定义全局异常处理

【十九】初学Kafka并实战整合SpringCloudStream进行使用

【二十】springboot整合ElasticSearch实战(万字篇)

【二十一】springboot整合过滤器实战

【二十二】springboot整合拦截器实战并对比过滤器

【二十三】springboot整合activiti7(1)实战演示篇

【二十四】springboot整合spring事务详解以及实战

【二十五】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十六】springboot整合jedis和redisson布隆过滤器处理缓存穿透

【二十七】springboot实现多线程事务处理

【二十八】springboot之threadLocal参数解析器实现session一样保存当前登录功能 

【二十九】springboot整合logback实现日志管理

【三十】springboot项目上高并发解决示例

目录

一、单机模式下高并发问题

二、集群模式下高并发问题


        本章演示在springboot项目中的高并发demo,演示导致的问题,以及单机部署下的解决方案和集群部署下的解决方式以及分布式下的解决方案。

一、单机模式下高并发问题

        前提:先写一个减扣数据库产品数量的一个接口作为测试。

        拿以前springboot整合布隆过滤网篇的一个接口直接做改造:假设编号为2的苹果库存还有一个,现在有个接口去买这个苹果并生成订单号以便于后期支付,得到如下:

1、数据表:

2、接口

通过jmeter模拟一秒钟有100个用户购买这个苹果,结果会是什么?

会发现直接卖爆了,一个苹果被卖了几十单。怎么解决这个并发问题呢?

PS:java提供了锁来处理 

1、乐观锁

        CAS先比较再交换,Java中提供了Atomic开头的类,例如AtomicInteger、AtomicLong、AtomicReference等原子类都是此思想来支持CAS操作的。进行如下改造,来实现先比较在修改值的方式解决该问题。其实就是在把cas想做是一个原子操作。改造方式就是例如给商品表增加一个字段用来表示该次原子性操作时,他应该是什么值,若是则修改,不然就不修改。如下:

 

        增加一个number字段,原理就是每次修改时带上这个number条件,而每次减少count后修改number的值(原子性)第一个请求的用户这样处理,其他同时查到这个订单的其他用户,在减少count时根据number条件却查不到这个订单了从而无法再生成订单。代码如下:

        继续jmeter测试,再看看结果如何?

        发现通过这种方式的确实现了防止超卖的现象。 

  • 优点:不用加锁,不会阻塞其他线程,性能相比较好。
  • 缺点:需要增加表字段,并且由于是在数据库层面保持原子性可能导致多事务操作操作同一数据时导致冲突,引起数据一致性问题。

        结论:所以在并发较少的情况下可以使用乐观锁方式。

2、悲观锁

        将通过下面两种锁来进行演示。

2.1、synchronized锁

        改造代码如下:

        通过测试得出: 

        发现实现了防止超卖,但是synchronized锁是基于jvm层面的,因此并不适用于集群模式。集群模式会涉及到一个服务的多实例,就会有多个jvm,synchronized只能保证当前实例在当前jvm下的原子性操作。

        我们用idea模拟一个集群来进行测试,如下:

        执行一下jmeter,看看结果是什么?

        我们可以看到模拟的每一个机器都抢到了一个,那依旧完犊子了呀。

        结论:集群模式下synchronized不可取。

2.2、Lock锁

        相比synchronized而言,这个锁是方法,而synchronized是关键字。使用lock的实现ReentrantLock

        改造代码如下:

        继续在模拟集群下进行测试,结果如下:

        结果和synchronized效果一样,只有在单机模式下可以保证没问题,而集群模式下依然会出现问题。

        结论:集群模式下Lock锁不可取。

二、集群模式下高并发问题

        上面讲了单机模式下可以采用的方式解决并发问题,但是有些方式在集群模式下就不可用了,下面就试一下在集群模式下依旧可以解决并发问题的方法。

        还是先看看不做任何处理的集群下进行抢商品是什么情况?

        简直是炸裂,这样上线不被领导怼着鼻子

        那我们怎么改造呢?我们引入Redisson。

        我们直接使用前面整合布隆过滤网的demo,就不讲整合Redisson了,已经讲过了,直接这里使用。

        改造后的代码如下:

        jmeter执行后的结果如下:

        三台机器只有一台抢到了一个苹果,达到了目的。Redisson的这个分布式锁的使用也很简单,如果服务挂掉,无法执行final的代码会如何,如下看看:

        我们打个断点假设服务在获取锁后服务挂了,redis如下:

        可10秒后,如下:

        锁已经过期失效不见了。因此并不会导致死锁的发生,这个分布式锁的具体实现大佬们可以评论区交流谈论或者后面再继续说。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工程经济学二

一、名词解释 可行性分析: 可行性研究是在投资项目拟建之前,通过对与项目有关的市场、资源、工程技术、经济和社会等方面的问题进行全面分析、论证和评价,从而确定项目是否可行或选择最佳实施方案的一项工作 厂址选择 厂址选择是指在一个大…

Java学习记录(十六):IO流(三)

缓冲流 缓冲流是一种高级流,可以理解为将基本流包装成了这种高级流,而这种高级流的特点就是将一个缓冲区放入到基本流当中,从而提高基本流的效率,但实际进行读写操作的还是基本流 下面为缓冲字节输出流和缓冲字节输入流的应用&am…

2024考研王道计算机408数据结构+操作系统+计算机组成原理+计算机网络

2024考研王道计算机408数据结构操作系统计算机组成原理计算机网络 链-接:https://pan.baidu.com/s/152XLyH64TlcLXwmU-zlAsQ?pwdr7zf 提取码:r7zf 信道利用率在408中经常考察到这里,我给大家总结一下这一类题目的做题方法以及技巧。首先&a…

全量知识系统问题及SmartChat给出的答复 之20 语义关联+词扇+叙词库 之1

Q67. 请问语义关联和词扇之间有什么关系? 语义关联和词扇是两种不同的概念,但它们之间有一定的关系。 语义关联指的是词语之间在语义上存在联系或关联,可以是同义关系、反义关系、上下位关系等。而词扇是指一个中心词周围所有与之相关的词语…

深度强化学习(二)

#! https://zhuanlan.zhihu.com/p/686235508 深度强化学习(二)(贝尔曼方程) 一.贝尔曼方程(将 Q π Q_\pi Qπ​ 表示成 Q π Q_\pi Qπ​ ) Theorem :假设 R t R_t Rt​ 是 S t 、 A t 、 S t 1 S_t 、 A_t 、 S_{t1} St​、At​、St1​ 的函数。…

基于SpringBoot疫情打卡健康评测系统

基于SpringBoot疫情打卡健康评测系统~ 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 学生端功能效果展示 试卷表 在线考试 打卡管理 居家管理 学生返校申请管理 管理…

救命!我终于会写一份简单的产品说明书了

写一份简单的说明书其实也不简单,需要有前期的调研准备,撰写时的条框梳理,收尾的清晰明了。网络上有很多撰写产品说明书的方法,却也有一些模糊的地方,下面就来看看LookLook同学是怎么完成一份简单的产品说明书的。 一、…

【Python】一文详细介绍plt.rcParams 在 Matplotlib 中的原理、作用、注意事项

【Python】一文详细介绍plt.rcParams 在 Matplotlib 中的原理、作用、注意事项 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x…

53. 最大子数组和(力扣LeetCode)

文章目录 53. 最大子数组和题目描述暴力(运行超时)贪心 53. 最大子数组和 题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组…

Nginx 反向代理与负载均衡是如何运行?

Nginx 是一个流行的开源Web服务器,它不仅可以用作正向代理服务器(处理客户端请求并转发给后端服务器),还可以用作反向代理服务器和负载均衡器。以下是Nginx反向代理与负载均衡是如何运行的概述: 1. 反向代理配置&…

是什么原因影响到服务器的稳定性

由于现在互联网行业发展迅速,所以各个企业都会通过网站来宣传自己的产品和企业,因此企业就需要通过租用服务器来作为 自己的网站存储空间,所以很多企业在选择服务器的时候,肯定会考虑到服务器的稳定性。 服务器稳定的几个关键&…

c++ primer plus 笔记 第十六章 string类和标准模板库

string类 string自动调整大小的功能: string字符串是怎么占用内存空间的? 前景: 如果只给string字符串分配string字符串大小的空间,当一个string字符串附加到另一个string字符串上,这个string字符串是以占用…

Python_使用带AES的压缩算法模块PyZipper

Python_使用带AES的压缩算法模块PyZipper 一、概述二、安装 PyZipper三、创建加密的 ZIP 文件四、解压加密的 ZIP 文件五、使用注意 一、概述 PyZipper 是一个用于创建、读取和修改 ZIP 文件的 Python 库,支持 AES 加密,提供了比标准库 zipfile 更多的功…

css 用flex做成田字型

哈喽&#xff0c;各位小伙伴&#xff01;今天给大家来css控制div完成田字型样式&#xff0c;来&#xff0c;看看下面的效果图&#xff1a; 一看就知道你们想要代码了&#xff0c;不急。代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head>&…

芯片设计流程中的def文件

Def文件的内容 DEF (design exchange format)文件描述了特定设计中所有物理元素的精确放置和连线信息。它们通常包含&#xff1a; 标准单元的精确放置位置宏的位置电源网格的设计时钟树的设计特殊单元的布局&#xff0c;如模拟单元连线信息&#xff0c;包括信号连线和电源连线…

python基础练习 序列求和

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 求123...n的值。 输入格式 输入包括一个整数n。 输出格式 输出一行&#xff0c;包括一个整数&#xff0c;表示123...n…

JAVA全面基础知识(第七部分)

大家好我是程序员阿存&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款&#xff0c;项目源码以及部署相关请联系存哥&#xff0c;文末附上联系信息 。 这篇文章给大家分享的是JAVA的基础知识&#xff0c; &#x1f495;&#x1f495;作者&#xff1a;程序员阿存 &…

哪里下载短视频素材?推荐几个短视频素材下载网站

当短视频行业的迅速崛起&#xff0c;剪辑影视短片的魅力无法抗拒&#xff0c;越来越多朋友爱看短视频&#xff0c;但从哪里找到高清、无水印和无字幕的短视频素材呢&#xff1f;今天&#xff0c;我将为大家推荐几个可获取短视频素材的优秀网站&#xff0c;下面让我们一起去看看…

ftl简单demo

包含&#xff1a; 遍历列表、获取列表长度、判断语句 <!DOCTYPE html> <html lang"en" xmlns"http://www.w3.org/1999/html"><head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible" content&qu…

python界面开发 - filedialog 文件选择对话框

文章目录 1. Tkinter 开发2. filedialog 文件选择对话框3. python图形界面开发3.1. Python图形界面开发——Tkinter3.2. Python图形界面开发——PyQt3.3. Python图形界面开发——wxPython3.4. Python图形界面开发—— PyGTK&#xff1a;基于GTK3.5. Python图形界面开发—— Kiv…