每秒批量插入10000条数据到MySQL中,资源消耗(带宽、IOPS)有多少?

文章目录

  • 🔊博主介绍
  • 🥤本文内容
    • 起因
    • 代码
    • 资源情况
    • 改造
  • 📢文章总结
  • 📥博主目标

🔊博主介绍

🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文专业写手、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五公里、🚀徒步爬过衡山、🔥有过三个月减肥20斤的经历、是个喜欢躺平的狠人。

📕拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

📙有过从0到1的项目高并发项目开发与管理经验,对JVM调优、MySQL调优、Redis调优 、ElasticSearch调优、消息中间件调优、系统架构调优都有着比较全面的实战经验。

📘有过云端搭建服务器环境,自动化部署CI/CD,弹性伸缩扩容服务器(最高200台),了解过秒级部署(阿里云的ACK和华为云的云容器引擎CCE)流程,能独立开发和部署整个后端服务,有过分库分表的实战经验。

🎥经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧,与清华大学出版社签下了四本书籍的合约,并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!


文章目录

  • 🔊博主介绍
  • 🥤本文内容
    • 起因
    • 代码
    • 资源情况
    • 改造
  • 📢文章总结
  • 📥博主目标

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。

💡在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

🥤本文内容

CSDN

起因

我在一台阿里云服务器部署了一主二从的MySQL集群,然后通过程序,控制每秒写入一万条数据入库,想看看消耗的资源情况

我本地跑的机器如下:
在这里插入图片描述网络用的是手机开的热点,使用的是5G网络

代码

    private ScheduledExecutorService poolExecutor;private ScheduledFuture<?> scheduledFuture;public void startCreateUserTask() {// 初始化线程池poolExecutor = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2);// 提交定时任务,并保存返回的ScheduledFuture对象scheduledFuture = poolExecutor.scheduleAtFixedRate(() -> {List<TbUser> userList = new ArrayList<>(10000);for (int i = 0; i < 10000; i++) {TbUser tbUser = new TbUser();tbUser.setIsDelete(0);tbUser.setUserStatus(1);String uid = UUID.randomUUID().toString();tbUser.setNickename("liaozhiwei" + uid);tbUser.setUsername("liaozhiwei" + uid);tbUser.setPassword("liao" + uid);userList.add(tbUser);}Integer usersave = tbUserMapper.batchInsert(userList);log.info("批量保存用户数量:" + usersave);},0, //这是首次执行任务前的延迟时间。它表示从当前时间开始到首次执行任务所需的等待时间。配置为0,表示无需等待1, TimeUnit.SECONDS);//这是任务执行的周期时间。每次任务执行完毕后,都会等待这个时间段后再次执行任务。}public void stopCreateUserTask() {// 如果scheduledFuture不为null,则取消定时任务if (scheduledFuture != null && !scheduledFuture.isCancelled()) {scheduledFuture.cancel(true); // 传入true表示如果任务正在执行,则中断它}// 关闭线程池if (poolExecutor != null && !poolExecutor.isShutdown()) {poolExecutor.shutdown(); // 这不会立即停止所有任务,而是启动关闭过程}}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yunxi.user.mapper.TbUserMapper" ><resultMap id="BaseResultMap" type="com.yunxi.user.model.po.TbUser" ><id column="id" property="id" jdbcType="INTEGER" /><result column="username" property="username" jdbcType="VARCHAR" /><result column="password" property="password" jdbcType="VARCHAR" /><result column="Is_Delete" property="isDelete" jdbcType="INTEGER" /><result column="user_status" property="userStatus" jdbcType="INTEGER" /><result column="nickename" property="nickename" jdbcType="VARCHAR" /></resultMap><!-- 用于select查询公用抽取的列 --><sql id="Base_Column_List">t.id,t.username,t.password,t.Is_Delete,t.user_status,t.nickename</sql><!-- batch insert --><insert id="batchInsert" parameterType="java.util.List">INSERT INTO tb_user (username,password,Is_Delete,user_status,nickename)VALUES<foreach collection="userList" item="item" index="index" separator="," >(#{item.username},#{item.password},#{item.isDelete},#{item.userStatus},#{item.nickename})</foreach></insert>
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://8.138.100.27:33061/user?characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8username: rootpassword: node1master1rootdruid:filters: stat,wall,slf4jinitial-size: 50min-idle: 100max-active: 20000max-wait: 60000time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000test-while-idle: truetest-on-borrow: falsetest-on-return: falseweb-stat-filter:enabled: trueurl-pattern: /*session-stat-enable: truesession-stat-max-count: 1000stat-view-servlet:enabled: trueurl-pattern: /druid/*reset-enable: truelogin-username: adminlogin-password: admin123

资源情况

在这里插入图片描述

在这里插入图片描述
网络带宽低于每秒20M,实例云盘IOPS(次/s)低于400,连接数、CPU使用率、内存使用率、负载情况都比较低,我的服务器配置如下:
在这里插入图片描述

4核(vCPU),16 GiB经济型的服务器配置。只对主库进行插入。

在没有什么并发量的场景下,批量插入的数据十几分钟就可以到一千万,虽然不是很快,毕竟控制了插入的量和频率,插入的数据比较稳定,没有数据丢失的情况。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

改造

    private ScheduledExecutorService poolExecutor;private ScheduledFuture<?> scheduledFuture;public void startCreateUserTask(){Map<Integer, String> hashMap = new ConcurrentHashMap<>(10000);Map<Integer, String> map = new ConcurrentHashMap<>(1000);// CPU100%的使用率ThreadPoolExecutor executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2, // 核心线程数: IO类型的任务通常建议设置为CPU核心数的两倍左右Runtime.getRuntime().availableProcessors() * 4, // 最大线程数:IO类型的任务建议设置为核心线程数的2-4倍60, // 空闲线程存活时间TimeUnit.SECONDS, // 时间单位new LinkedBlockingQueue<>(10000));executor.execute(() -> {for (int i = 0; i < 10000; i++) {String uid = UUID.randomUUID().toString();hashMap.put(i,uid);}// 使用 Stream API 对 HashMap 中的值(密码)进行编码,并创建一个新的 Map 来存储编码后的密码Map<Integer, String> encodedPasswordsMap = hashMap.entrySet().parallelStream().map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), passwordEncoder.encode(entry.getValue()))).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> newValue, ConcurrentHashMap::new));map.putAll(encodedPasswordsMap);});// 关闭线程池,不再接受新任务,但等待已提交的任务完成executor.shutdown();try {// 等待所有任务在60秒内完成,或者超时if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {// 如果超时,可以选择取消所有未完成的任务System.out.println("Not all tasks finished within the timeout period. Cancelling remaining tasks.");executor.shutdownNow();// 可能需要处理任务被取消的情况} else {System.out.println("All tasks have completed.");}} catch (InterruptedException ie) {// 如果等待期间线程被中断,重新中断当前线程executor.shutdownNow();Thread.currentThread().interrupt();}if (map.size() == 10000) {// 初始化线程池poolExecutor = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2);// 提交定时任务,并保存返回的ScheduledFuture对象scheduledFuture = poolExecutor.scheduleAtFixedRate(() -> {List<TbUser> userList = new ArrayList<>(10000);for (int i = 0; i < 10000; i++) {TbUser tbUser = new TbUser();tbUser.setIsDelete(0);tbUser.setUserStatus(1);String uid =  UUID.randomUUID().toString();tbUser.setNickename("liaozhiwei" + uid);tbUser.setUsername("liaozhiwei" + uid);tbUser.setPassword(map.get(i));userList.add(tbUser);}Integer usersave = tbUserMapper.batchInsert(userList);log.info("批量保存用户数量:" + usersave);},0, //这是首次执行任务前的延迟时间。它表示从当前时间开始到首次执行任务所需的等待时间。配置为0,表示无需等待1, TimeUnit.SECONDS);//这是任务执行的周期时间。每次任务执行完毕后,都会等待这个时间段后再次执行任务。}}public void stopCreateUserTask() {// 如果scheduledFuture不为null,则取消定时任务if (scheduledFuture != null && !scheduledFuture.isCancelled()) {scheduledFuture.cancel(true); // 传入true表示如果任务正在执行,则中断它}// 关闭线程池if (poolExecutor != null && !poolExecutor.isShutdown()) {poolExecutor.shutdown(); // 这不会立即停止所有任务,而是启动关闭过程}}

将代码调整后,一次插入100000,多了十倍,但是执行的时间也是多了十倍多,时间会多一丢丢,推断可能和我的网络有关,手机热点传输低于服务器带宽,传输有限,所以本机测试,一秒一万是最合适的。如果上服务器,执行效率应该会更高一点。
在这里插入图片描述线程资源使用率100%,最大程度对密码进行加密计算,缩短计算时长。

CSDN

📢文章总结

对本篇文章进行总结:

🔔以上就是今天要讲的内容,阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。

以梦为马,不负韶华

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

🚀🎉希望各位读者大大多多支持用心写文章的博主,现在时代变了,🚀🎉 信息爆炸,酒香也怕巷子深🔥,博主真的需要大家的帮助才能在这片海洋中继续发光发热🎨,所以,🏃💨赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

  • 💂 博客主页: 我是廖志伟
  • 👉开源项目:java_wxid
  • 🌥 哔哩哔哩:我是廖志伟
  • 🎏个人社区:幕后大佬
  • 🔖个人微信号SeniorRD
  • 🎉微信号二维码SeniorRD

📥博主目标

探寻内心世界,博主分享人生感悟与未来目标

  • 🍋程序开发这条路不能停,停下来容易被淘汰掉,吃不了自律的苦,就要受平庸的罪,持续的能力才能带来持续的自信。我本是一个很普通的程序员,放在人堆里,除了与生俱来的盛世美颜,就剩180的大高个了,就是我这样的一个人,默默写博文也有好多年了。
  • 📺有句老话说的好,牛逼之前都是傻逼式的坚持,希望自己可以通过大量的作品、时间的积累、个人魅力、运气、时机,可以打造属于自己的技术影响力。
  • 💥内心起伏不定,我时而激动,时而沉思。我希望自己能成为一个综合性人才,具备技术、业务和管理方面的精湛技能。我想成为产品架构路线的总设计师,团队的指挥者,技术团队的中流砥柱,企业战略和资本规划的实战专家。
  • 🎉这个目标的实现需要不懈的努力和持续的成长,但我必须努力追求。因为我知道,只有成为这样的人才,我才能在职业生涯中不断前进并为企业的发展带来真正的价值。在这个不断变化的时代,我们必须随时准备好迎接挑战,不断学习和探索新的领域,才能不断地向前推进。我坚信,只要我不断努力,我一定会达到自己的目标。

🔔有需要对自己进行综合性评估,进行职业方向规划,我可以让技术大牛帮你模拟面试、针对性的指导、传授面试技巧、简历优化、进行技术问题答疑等服务。

可访问:https://java_wxid.gitee.io/tojson/

开发人员简历优化、面试突击指导、技术问题解答

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

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

相关文章

Redis入门到实战-第十二弹

Redis实战热身Bitfields篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理…

Elasticsearch:使用在本地计算机上运行的 LLM 以及 Ollama 和 Langchain 构建 RAG 应用程序

无需 GPU 的隐私保护 LLM。在本博客中&#xff0c;我将演示使用不同的工具 Ollama 构建的 RAG 应用程序。 与本文相关的所有源代码均已发布在 github上。 请克隆存储库以跟随文章操作。我们可以通过如下的方式来克隆&#xff1a; git clone https://github.com/liu-xiao-guo/o…

Unity 学习笔记 5.控制飞机飞行

目录 1.摄像机跟随的方法 2.鼠标按键响应 3.键盘按键响应 4.导入素材 5.让飞机向前飞 6.摄像机跟随飞机移动 7.鼠标控制飞机倾斜 8.键盘控制飞机飞行 下载源码 UnityPackage 1.摄像机跟随的方法 2.鼠标按键响应 3.键盘按键响应 4.导入素材 下载素材 步骤&#xff1a; 将…

itextPdf生成pdf简单示例

文章环境 jdk1.8&#xff0c;springboot2.6.13 POM依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><dependency><groupId>com.ite…

3/21 work

自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面。&#xff08;不要使用课堂上的图片和代码&#xff0c;自己发挥&#xff0c;有利于后面项目的完成&#xff09; 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&#xff0c;通…

网络——套接字编程UDP

目录 端口号 源端口号和目的端口号 认识TCP协议和UDP协议 网络字节序 socket编程接口 socket常见接口 sockaddr结构 UDP socket bind recvfrom sendto 编写客户端 绑定INADDR_ANY 实现聊天功能 端口号 在这之前我们已经说过源IP地址和目的IP地址&#xff0c;还有…

【vue核心技术实战精讲】1.6 - 1.8 VUE 指令 (中)

文章目录 前言 本节内容1、v-on使用v-on好处效果 2、事件修饰符2.1、按键码 (<font color red>已废弃&#xff0c;不用研究)示例效果 3、v-for 列表渲染示例效果 前言 上节,我们学习了 Vue指令之v-text 、 v-html、v-if 、v-show、v-bind 点击进入上一节 本节内容 Vue…

敏捷开发——第二次作业JS/服务器的部署

部署 Web 服务器 1. 安装 Apache HTTP 服务器并部署静态网页应用 ⭐⭐ 默认情况下&#xff0c;Apache 在 /var/www/html 目录下寻找要提供服务的文件。可以将静态网页文件放置在这个目录下 2.安装 Nginx 并部署静态页面应用 3. 实践部分 1. 2. 3. 在 /var/www/html 目录下…

matlab 条件数的倒数

目录 一、概述1、算法概述2、主要函数3、参考文献二、条件设置错误的矩阵的敏感度三、求解单位矩阵的条件四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 1、算法概述

快速上手 Elasticsearch:Docker Compose 部署详解

最近面试竞争日益激烈&#xff0c;Elasticsearch作为一款广泛应用的中间件&#xff0c;几乎成为面试中必考的知识点。最近&#xff0c;AIGC也备受关注&#xff0c;而好多的AI项目中也采用了Elasticsearch作为向量数据库&#xff0c;因此我们迫切希望学习Elasticsearch。对于学习…

鸿蒙NXET实战:高德地图定位SDK【获取Key+获取定位数据】(二)

如何申请key 1、创建新应用 进入[控制台]&#xff0c;创建一个新应用。如果您之前已经创建过应用&#xff0c;可直接跳过这个步骤。 2、添加新Key 在创建的应用上点击"添加新Key"按钮&#xff0c;在弹出的对话框中&#xff0c;依次&#xff1a;输入应用名名称&…

如何修复WordPress网站媒体库上传文件失败的问题

公司最近推出了一系列新产品&#xff0c;为了更新网站的视频和图片&#xff0c;我们需要将它们上传至网站媒体库。然而&#xff0c;在上传视频时&#xff0c;我们却遇到了一些问题。系统提示说&#xff0c;我们尝试上传的视频文件大小超出了站点的最大上传限制。尽管我们的视频…

apisix创建https

总结了下apisix 使用https 的问题和方法 1、apisix 默认https 端口是9443 2、apisix 需要上传证书后才可以使用https 否二curl测试会报错 SSL routines:CONNECT_CR_SRVR_HELLO 3、apisix 上传证书方法 我是使用的自签名证书&#xff0c;注意自签名证书的Common Name 要写你…

Open CASCADE学习|显示文本

目录 1、修改代码 Viewer.h&#xff1a; Viewer.cpp&#xff1a; 2、显示文本 OpenCasCade 你好啊 霜吹花落 1、修改代码 在文章《Open CASCADE学习|显示模型》基础上&#xff0c;增加部分代码&#xff0c;实现对文本显示的支持&#xff0c;具体如下&#xff1a; Viewer…

思腾合力携AI服务器亮相第二十一届中国电博会

博会已发展成为海峡两岸IT产业界规模最大、参展企业最多、产业配套最全的知名展会之一&#xff0c;今年以“数字赋能、创新制造”为主题&#xff0c;线下参展企业达400家。展会期间&#xff0c;举办了论坛与产业洽谈会等系列活动&#xff0c;进一步推动了两岸电子信息产业融合发…

进程和线程,线程实现的几种基本方法

什么是进程&#xff1f; 我们这里学习进程是为了后面的线程做铺垫的。 一个程序运行起来&#xff0c;在操作系统中&#xff0c;就会出现对应的进程。简单的来说&#xff0c;一个进程就是跑起来的应用程序。 在电脑上我们可以通过任务管理器可以看到&#xff0c;跑起来的应用程…

redis在springboot项目中的应用

一&#xff0c;将查询结果放到redis中作为缓存&#xff0c;减轻mysql的压力。 只有在数据量大的时候&#xff0c;查询速度慢的时候才有意义。 本次测试的数据量为百万级别。 测试代码: 功能为根据昵称进行模糊匹配。 GetMapping("/get-by-nick")public String get…

数字保护的壁垒:探索 Web3 的网络安全

引言 随着数字化时代的到来&#xff0c;网络安全问题日益突出&#xff0c;而Web3作为新一代互联网的演进形态&#xff0c;其网络安全问题备受关注。本文将深入探讨Web3的网络安全特点、挑战以及应对策略&#xff0c;帮助读者更好地了解数字保护的壁垒与Web3的关系&#xff0c;…

ctfshow web入门 反序列化

254 分析代码&#xff1a; 如果用户名和密码参数都存在&#xff0c;脚本会创建一个 ctfShowUser 类的实例 $user。 接着&#xff0c;调用 $user->login($username, $password) 方法尝试登录。如果登录成功&#xff08;即用户名和密码与类中的默认值匹配&#xff09;&#…

vscode中导入#include “opencv2/opencv.hpp“

鼠标放到上面 点击快速修复 1.img.cpp // 图片的读取和显示 // 导入opencv头文件 #include "opencv2/opencv.hpp" #include <iostream>int main(int argc, char** argv) {// 读取图片&#xff0c;mat是matrix的缩写&#xff0c;是一个矩阵&#xff0c;类似与n…