【三十】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.hqwc.cn/news/529247.html

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

相关文章

信钰证券:股市牛市有什么特征?存在以下八大特征

股市牛市存在以下特征: 1、大盘在底部呈现接连的阳K线,一起大盘指数突破上方重要的关口,这说明大盘突破上方压力方位,把转换成支撑方位,行将开启上涨趋势,创建新高。 2、市场上的资金大量流入&#xff0c…

基于php的用户登录实现(v1版)(持续迭代)

目录 版本说明 数据库连接 登录页面:login.html 登录处理实现:login.php 用户欢迎页面:welcome.php 用户注册页面:register.html 注册执行:DoRegister.php 版本说明 v1实现功能: 数据库连接&#x…

图片如何压缩到200k以下?3个图片压缩技巧分享

图片如何压缩到200k以下?在日常生活中,将图片压缩至200K以下至关重要。这不仅能有效节省存储空间,让手机或电脑运行的更流畅,还能显著加快网络传输速度,提升分享和上传体验。同时,许多平台对上传图片的大小…

分类预测 | Matlab基于TTAO-CNN-LSTM-Attention三角拓扑聚合优化算法优化卷积神经网络-长短期记忆网络-注意力机制的数据分类预测

分类预测 | Matlab基于TTAO-CNN-LSTM-Attention三角拓扑聚合优化算法优化卷积神经网络-长短期记忆网络-注意力机制的数据分类预测 目录 分类预测 | Matlab基于TTAO-CNN-LSTM-Attention三角拓扑聚合优化算法优化卷积神经网络-长短期记忆网络-注意力机制的数据分类预测分类效果基…

CMake: 在构建世界掀起风暴

由简至繁,以小见大。首先,让我们从标准的 Gartner 技术成熟度曲线开始,了解 CMake 的发展,感受 CMake 对行业的深远影响。 图片来源:Gartner (我在原图基础上增加了年份) CMake 的开发从1999年开始,最初的…

PHP代码审计

前言 本文章主要是PHP代码审计的一些基础知识,包括函数的用法,漏洞点,偏向基础部分,个人能力有限,部分可能会出现错误或者遗漏,读者可自行补充。 代码执行 代码执行是代码审计当中较为严重的漏洞&#x…

Dgraph 入门教程三《linux本地部署》

上一章中,我们用的官方的Clound操作的,怎么在本地部署一套Dgraph呢。这一章将做详细介绍。安装有好几种方式,最简单的就是联网部署。因为项目需要,这里先不介绍和测试线上部署了,只介绍离线部署。 1、下载安装包 Rel…

JVM工作原理与实战(四十三):JVM常见面试题目

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、JVM常见面试题目 1.什么是类加载器,有哪些常见的类加载器? 2.什么是双亲委派机制,以及如何打破双亲委派机制? 3.如何判断堆上的对…

大数据与云计算

目录 一、大数据时代二、云计算——大数据的计算三、云计算发展现状四、云计算实现机制五、云计算压倒性的成本优势 一、大数据时代 我们先来看看百度关于 “大数据”(Big Data)的搜索指数。 可以看出,“大数据” 这个词是从2012年才引起关注…

【C++从0到王者】第五十二站:跳表

文章目录 一、什么是跳表二、skiplist的效率三、skiplist的实现 一、什么是跳表 skiplist本质上也是一种查找结构,用于解决算法中的查找问题,跟平衡搜索树和哈希表的价值是一样的,可以作为key或者key/value的查找模型。 skiplist,…

参加春招的同学,请做好综合素质测评的准备

每年的春招期间,大量的毕业生会涌向人才市场,企业面对如此大量的群体,如何选择适合的人才? 仅仅是通过简历还无法更好的了解应聘者的能力,但是如果采用一个一个的面试,又会浪费大量的时间,这种效…

Java高级编程—注解

文章目录 1.注解的概述2.常见的Annotation示例2.1 生成文档相关的注解2.2 在编译时进行格式检查的注解2.3 跟踪代码依赖性,实现替代配置文件功能的注解 3.自定义Annotation4.JDK中的元注解4.1 Retention4.2 Target4.3 Documented & Inherited 5. JDK8中注解的新…