【三十】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秒后,如下:

锁已经过期失效不见了。因此并不会导致死锁的发生,这个分布式锁的具体实现大佬们可以评论区交流谈论或者后面再继续说。
相关文章:
【三十】springboot项目上高并发解决示例
互相交流入口地址 整体目录: 【一】springboot整合swagger 【二】springboot整合自定义swagger 【三】springboot整合token 【四】springboot整合mybatis-plus 【五】springboot整合mybatis-plus 【六】springboot整合redis 【七】springboot整合AOP实现日志操作 【…...
原生JavaScript,根据后端返回JSON动态【动态列头、动态数据】生成表格数据
前期准备: JQ下载地址: https://jquery.com/ <!DOCTYPE html> <html><head><meta charset"utf-8"><title>JSON动态生成表格数据,动态列头拼接</title><style>table {width: 800px;text-align: cen…...
OD_2024_C卷_200分_9、园区参观路径【JAVA】【动态规划】
package odjava;import java.util.Scanner;public class 九_园区参观路径 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 长 -> 行数int m sc.nextInt(); // 宽 -> 列数int[][] matrix new int[n][m]; // 地图…...
校园小情书微信小程序源码 | 社区小程序前后端开源 | 校园表白墙交友小程序
项目描述: 校园小情书微信小程序源码 | 社区小程序前后端开源 | 校园表白墙交友小程序 功能介绍: 表白墙 卖舍友 步数旅行 步数排行榜 情侣脸 漫画脸 个人主页 私信 站内消息 今日话题 评论点赞收藏 服务器环境要求:PHP7.0 MySQL5.7 效果…...
数据结构小记【Python/C++版】——散列表篇
一,基础概念 散列表,英文名是hash table,又叫哈希表。 散列表通常使用顺序表来存储集合元素,集合元素以一种很分散的分布方式存储在顺序表中。 散列表是一个键值对(key-item)的组合,由键(key)和元素值(item)组成。键…...
前端框架的发展史可以追溯到早期的静态网页时代
前端框架的发展史可以追溯到早期的静态网页时代。以下是前端框架的主要发展阶段: 静态网页时代:在互联网的初期,网页主要由HTML、CSS和JavaScript构成。这些网页是静态的,没有复杂的交互和动态内容。 原生JavaScript时代…...
迷宫可行路径数
题目描述 现有一个n∗m大小的迷宫,其中1表示不可通过的墙壁,0表示平地。每次移动只能向上下左右移动一格(不允许移动到曾经经过的位置),且只能移动到平地上。求从迷宫左上角到右下角的所有可行路径的条数。 输入描述…...
消息队列学习
消息队列是什么 消息队列:Kafka、RocketMQ、RabbitMQ等 腾讯云CMQ消息队列介绍是这么说的: 腾讯云消息队列(Cloud Message Queue,以下简称 CMQ)是分布式的消息队列服务,用于存储进程间传输的消息ÿ…...
API接口技术开发店铺详情接口采集店铺ID、卖家ID、掌柜名字、店铺名、店铺类型、店铺主页、店铺等级、店铺评分、联系方式等数据接入演示
API接口技术开发店铺详情接口采集店铺ID、卖家ID、掌柜名字、店铺名、店铺类型、店铺主页、店铺等级、店铺评分、联系方式等数据,可以按照以下步骤进行接入演示: 注册并获取API密钥: 在电商平台的开发者中心注册账号。创建一个应用࿰…...
ffmpeg maxrate 导致转码输出的内容包含随机性
https://trac.ffmpeg.org/wiki/Limiting%20the%20output%20bitrate 问题 领导提出了一个问题,为什么转码后的视频大小字节数据都不一样,这问到我了,一时语塞。查一下吧,没有什么资料支撑。主动试一下。 尝试 首先尝试一下直接…...
Graphpad Prism10.2.1(395) 安装教程 (含Win/Mac版)
GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件,它可以将科学图形、综合曲线拟合(非线性回归)、可理解的统计数据、数据组织结合在一起,除了最基本的数据统计分析外,还能自动生成统…...
Cocos Creator 2d光照
godot游戏引擎是有2d光照的,用起来感觉还是很强大的,不知道他是怎么搞的,有时间看看他们怎么实现的。 之前一直以为cocos社区里面没有2d光照的实现,偶然看到2d实现的具体逻辑,现在整理如下, 一࿱…...
5款好用的AI办公软件,一键轻松制作PPT、视频,提升工作效率!
众所周知,AI 人工智能技术已渗透到生活的方方面面,无论是很多人早已用上的智能音箱、语音助手,还是新近诞生的各种 AI 软件工具,背后都离不开 AI 人工智能技术的加持。 对于各类新生的 AI 软件工具,人们很容易「选边站…...
【MyBatis面试题】
目录 前言 1.MyBatis执行流程。 2.Mybatis是否支持延迟加载? 3.延迟加载的底层原理知道吗? 4.Mybatis的一级、二级缓存用过吗? 5.Mybatis的二级缓存什么时候会清理缓存中的数据? 总结 前言 本文主要介绍了MyBatis面试题相…...
编程界的圣经:从Scheme到JavaScript构建你的计算思维
文章目录 适读人群目 录 《计算机程序的构造和解释》(Structure and Interpretation of Computer Programs,简记为SICP)是MIT的基础课教材,出版后引起计算机教育界的广泛关注,对推动全世界大学计算机科学技术教育的发…...
智慧城市与智慧乡村:共创城乡一体化新局面
一、引言 随着科技的不断进步和城乡发展的日益融合,智慧城市与智慧乡村的建设已成为推动城乡一体化发展的新引擎。智慧城市利用物联网、大数据、云计算等先进技术,实现城市治理、公共服务、产业发展等领域的智能化;而智慧乡村则借助现代科技…...
蓝桥杯——web(ECharts)
ECharts 初体验 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><script src"echarts.js">&l…...
MySQL数据库在Windows和Linux中由于大小写默认规则不同,出现大小写问题如何解决?
Windows和Linux差异:在Windows上,lower_case_table_names默认为1,而在Linux上,默认值通常为0。因此,在Linux上更改这个设置更常见,以确保与Windows环境的兼容性或实现特定的大小写敏感性需求。 操作系统的大…...
新雀优化算法NOA求解机器人栅格地图最短路径规划,可以自定义地图(提供MATLAB代码)
一、星雀优化算法 星雀优化算法(Nutcracker optimizer algorithm,NOA)由Mohamed Abdel-Basset等人于2023年提出,该算法模拟星雀的两种行为,即:在夏秋季节收集并储存食物,在春冬季节搜索食物的存储位置。CEC2005:星雀优化算法(Nut…...
重塑语言智能未来:掌握Transformer,驱动AI与NLP创新实战
Transformer模型 Transformer是自然语言理解(Natural Language Understanding,NLU)的游戏规则改变者,NLU 是自然语言处理(Natural Language Processing,NLP)的一个子集。NLU已成为全球数字经济中AI 的支柱之一。 Transformer 模型标志着AI 新…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...

