当前位置: 首页 > news >正文

Jmeter 动态参数压力测试时间段预定接口

🎯 本文档详细介绍了如何使用Apache JMeter进行压力测试,以评估预定接口在高并发场景下的性能表现。通过创建线程组模拟不同数量的用户并发请求,利用CSV文件动态配置时间段ID和用户token,确保了测试数据的真实性和有效性。文档中还展示了如何设置JMeter的各项参数、添加HTTP请求头、查看结果树和聚合报告等操作步骤。最终,通过一次针对4000用户并发的压测实例,分析了样本数、响应时间、异常率及吞吐量等关键指标,验证了系统的稳定性和可靠性。

文章目录

  • 压力测试
  • Jmeter介绍
  • 测试目标
  • 数据准备
  • Jmeter如何进行操作
    • Jmeter设置
    • 创建线程组
    • 创建 HTTP 请求
    • 添加请求头
    • 添加查看结果树、聚合报告
    • 动态参数
      • 给请求参数配置不同的时间段ID
        • 依赖
        • CSV生成代码
        • 绑定CSV文件
      • 配置不同的用户token
        • CSV 生成
        • 绑定 CSV 文件
    • 简单测试
  • 正式压测
    • 测试环境
    • 相同的服务如何启动多个
    • 内存预热
    • 压力测试
    • Jmeter结构

压力测试

为了评估和测量接口在高负载情况下的性能表现。压力测试通常用于确定系统在预期的最大负载下的运行情况,识别系统可能存在的性能瓶颈,以及验证系统的稳定性和可靠性。压力测试对于确保应用程序能够支持特定数量的并发用户或操作至关重要。

Jmeter介绍

Apache JMeter 是一款开源的、基于Java的性能测试工具,主要用于测试静态和动态资源(如静态文件、Java Servlets、CGI脚本、数据库和其他基于Web的应用程序资源等)的性能。它最初设计用于Web应用测试但后来扩展到其他测试领域。JMeter可以用来模拟大量用户并发访问目标服务,以此来分析在不同负载条件下应用的性能表现。此外,它支持多种协议和技术,包括HTTP、HTTPS、FTP、SOAP、REST、LDAP、TCP、SMTP等,极大地增强了其灵活性和适用范围。JMeter的一大优点是它能够以图形界面或命令行模式运行,而且由于它是用Java编写的,因此可以在任何安装了Java虚拟机的平台上使用,具有很好的跨平台性。

  • 官网:https://jmeter.apache.org/
  • 下载地址:https://jmeter.apache.org/download_jmeter.cgi

测试目标

测试时间段预定接口在不同并发用户下的吞吐量。

数据准备

为了让测试结果更加有参考性,需要尽量模拟现实生活中的预定逻辑,即肯定是有多个用户同时进行预定,且预定的场馆、分区、时间段都可能不同。因此我们需要先模拟生成一些数据,其中包括场馆、分区、时间段模板、时间段。最终需要传给Jmeter的数据有:

  • 可接受预定的不同时间段 id
  • 不同用户登录之后的 token

Jmeter如何进行操作

Jmeter设置

修改为白色外观

在这里插入图片描述

设置为简体中文,方便操作,如果你英语好,当我没说,哈哈哈

在这里插入图片描述

创建线程组

创建线程组是一个基础且关键的步骤。线程组主要用来模拟用户对服务器或应用程序发起请求的行为。具体来说,它定义了虚拟用户的数目(即线程数)、这些用户将如何行动以及它们执行动作的时间安排(如启动时间、持续时间和关闭时间)。

在这里插入图片描述

初步设置如下参数,后续在进行压力测试的时候,可以从小到大调整线程数等参数

  • 一个线程代表一个用户,每个用户对不同时间段发起多次请求,可以先从50个用户开始,逐步增加到500或1000个用户,观察接口的性能变化
  • 循环次数:每个线程发请求的数量,相当于一个用户发起多少次预定
  • Ramp-Up时间:设置为5秒,表示这1000个线程,会在5秒内均匀启动起来,每个线程之间的启动间隔大约为 5/1000 秒

在这里插入图片描述

创建 HTTP 请求

预订接口如下:

@GetMapping("/v1/reserve")
public Result reserve(@RequestParam("timePeriodId") Long timePeriodId) {OrderDO orderDO = timePeriodService.reserve(timePeriodId);return Results.success(orderDO);
}

在这里插入图片描述

这里需要设置服务所在IP、端口,以及请求的接口路径。因为预定的时候,需要指明是哪个时间段,所以需要在参数中进行设置

在这里插入图片描述

添加请求头

由于用户在预定时间段的时候,需要先从用户登录之后的 token 信息中获知用户是谁,所以我们需要将 token 设置到请求头中

在这里插入图片描述

注意:除了设置 token 之外,还需要添加Content-typeapplication/json,后端接口才能正常解析 json 数据

在这里插入图片描述

添加查看结果树、聚合报告

  • 结果树:用来查看请求的请求参数、响应结果
  • 聚合报告:用来查看这些请求的统计信息

在这里插入图片描述

动态参数

因为我们需要模拟不同用户预定不同时间段的行为,这期间用户、时间段都有多个,因此,我们不能写死 HTTP 请求中的请求参数,而是需要使用动态参数,从 CSV 文件中读取数据,然后动态设置到不同的请求中

给请求参数配置不同的时间段ID

依赖

CSV导出直接写一个单元测试类即可,首先引入测试相关的依赖

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
CSV生成代码
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.vrs.domain.entity.TimePeriodDO;
import com.vrs.service.TimePeriodService;
import com.vrs.utils.TxtUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;import java.io.File;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.util.List;/*** 可预定时间段id CSV 导出** @Author dam* @create 2025/1/12 15:06*/
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {VrsVenueApplication.class})
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ReserveTestCSVGenerateTest {@Autowiredprivate TimePeriodService timePeriodService;/*** csv地址*/private final String csvPath = Paths.get("").toAbsolutePath().getParent().getParent() + File.separator + "tmp" + File.separator + "场馆预定时间段.csv";@Testpublic void generate() throws Exception {StringBuilder stringBuilder = new StringBuilder();QueryWrapper<TimePeriodDO> queryWrapper = new QueryWrapper<>();// 只查询在今天和今天之后的可预订时间段queryWrapper.ge("period_date", LocalDate.now());List<TimePeriodDO> timePeriodDOList = timePeriodService.list(queryWrapper);for (TimePeriodDO timePeriodDO : timePeriodDOList) {stringBuilder.append(timePeriodDO.getId() + "\n");}TxtUtil.write(new File(csvPath), stringBuilder.toString(), "utf-8");}
}

通过下面的注解为基于Spring Boot的应用程序提供全面的测试支持,包括依赖注入、应用上下文的配置以及Web环境的模拟等,这样我们才可以注入TimePeriodService来进行查询数据库等操作

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {VrsVenueApplication.class})
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

导出的CSV文件如下图所示

在这里插入图片描述

绑定CSV文件

最后一步是给请求绑定 CSV 文件

在这里插入图片描述

设置CSV文件路径

在这里插入图片描述

最后在请求的参数中使用,通过表头列名来绑定数据,使用方式为${列名}

在这里插入图片描述

配置不同的用户token

CSV 生成
import com.vrs.domain.entity.UserDO;
import com.vrs.service.UserService;
import com.vrs.utils.TxtUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;import java.io.File;
import java.nio.file.Paths;
import java.util.List;/*** 模拟用户数据生成** @Author dam* @create 2025/1/12 15:06*/
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {VrsAdminApplication.class})
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserTokenCSVGenerateTest {@Autowiredprivate UserService userService;/*** csv地址*/private final String csvPath = Paths.get("").toAbsolutePath().getParent().getParent() + File.separator + "tmp" + File.separator + "用户token.csv";@Testpublic void generate() throws Exception {StringBuilder stringBuilder = new StringBuilder();List<UserDO> userDOList = userService.list();for (UserDO userDO : userDOList) {// 登录并返回一个tokenstringBuilder.append(userService.handleLogin(userDO).getToken() + "\n");}TxtUtil.write(new File(csvPath), stringBuilder.toString(), "utf-8");}
}
绑定 CSV 文件

在这里插入图片描述

在这里插入图片描述

简单测试

完成上面的操作之后,启动压力测试即可,在查看结果树中,可以看到每个请求是否成功,响应结果是什么

在这里插入图片描述

接口错误的原因

在这里插入图片描述

在汇总报告中,可以查看压力测试的统计数据,例如接口调用时间的平均值、最小值、最大值,吞吐量……,这里异常那么高的原因是:用户已经购买过相应时间段或者时间段已经售罄

在这里插入图片描述

正式压测

测试环境

【测试机器】

  • 名称:MacBook Pro 2023
  • 尺寸:14英寸
  • CPU:m2 pro丐版芯片
  • 内存:16GB

【服务启动方式】

为了模拟真实分布式环境下的性能表现,项目使用微服务方式启动,其中场馆服务启动两个

相同的服务如何启动多个

在这里插入图片描述

配置可以启动多个实例,然后点击调试启动

在这里插入图片描述

在这里插入图片描述

然后就会报错,端口被占用

在这里插入图片描述

重新替换一个端口

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

内存预热

为了在预定的时候可以快速查询,首先对需要使用到缓存进行预热,这里涉及的缓存有时间段信息、时间段库存、时间段位图

package com.vrs;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.vrs.constant.RedisCacheConstant;
import com.vrs.domain.entity.PartitionDO;
import com.vrs.domain.entity.TimePeriodDO;
import com.vrs.service.PartitionService;
import com.vrs.service.TimePeriodService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;import java.time.LocalDate;
import java.util.List;/*** 时间段预定缓存预热** @Author dam* @create 2025/1/12 15:06*/
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {VrsVenueApplication.class})
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class TimePeriodCacheLoadTest {@Autowiredprivate TimePeriodService timePeriodService;@Autowiredprivate PartitionService partitionService;@Testpublic void generate() throws Exception {QueryWrapper<TimePeriodDO> queryWrapper = new QueryWrapper<>();// 只查询在今天和今天之后的可预订时间段queryWrapper.ge("period_date", LocalDate.now());List<TimePeriodDO> timePeriodDOList = timePeriodService.list(queryWrapper);for (TimePeriodDO timePeriodDO : timePeriodDOList) {timePeriodService.getTimePeriodDOById(timePeriodDO.getId());PartitionDO partitionDO = partitionService.getPartitionDOById(timePeriodDO.getPartitionId());// 首先检测空闲场号缓存有没有加载好,没有的话进行加载timePeriodService.checkBitMapCache(String.format(RedisCacheConstant.VENUE_TIME_PERIOD_FREE_INDEX_BIT_MAP_KEY, timePeriodDO.getId()), timePeriodDO.getId(), partitionDO.getNum());// 其次检测时间段库存有没有加载好,没有的话进行加载timePeriodService.getStockByTimePeriodId(timePeriodDO.getId());}}
}

预热之后的缓存如下:

在这里插入图片描述

压力测试

测试参数如下:

  • 线程数:4000
  • 循环次数:10
  • Ramp-Up时间

即模拟4000个用户进行场馆预定,每个用户分别发送20次预定请求,线程在20秒内启动完成

在这里插入图片描述

测试结果如下:

在这里插入图片描述

  1. 样本数量:总共进行了40,000次样本测试。
  2. 响应时间
    1. 平均值:7345毫秒,表示平均每个请求的响应时间。
    2. 最小值:0毫秒,表示最快的响应时间。
    3. 最大值:10932毫秒,表示最慢的响应时间。
    4. 标准偏差:1773.39,表示响应时间的波动程度,较大的标准偏差表明响应时间变化较大。
  3. 异常率:1.84%,表示在所有请求中,有1.84%的请求出现了异常。当然这里的异常是:时间段售罄。
  4. 吞吐量:表示系统在测试期间每秒可以处理 427.7 个请求。
  5. 数据传输
    1. 接收速率:255.18 KB/sec,表示系统每秒接收的数据量。
    2. 发送速率:206.96 KB/sec,表示系统每秒发送的数据量。
    3. 平均字节数:611.0字节,表示每个请求的平均数据量。

Jmeter结构

在这里插入图片描述

相关文章:

Jmeter 动态参数压力测试时间段预定接口

&#x1f3af; 本文档详细介绍了如何使用Apache JMeter进行压力测试&#xff0c;以评估预定接口在高并发场景下的性能表现。通过创建线程组模拟不同数量的用户并发请求&#xff0c;利用CSV文件动态配置时间段ID和用户token&#xff0c;确保了测试数据的真实性和有效性。文档中还…...

Learning Prompt

说明&#xff1a;这是我的学习笔记&#xff0c;很多内容转自网络&#xff0c;请查阅文章末尾的参考资料。 目录 基本要求(C.R.E.A.T.E)总结文章(Summarise)改写文章(Rewrite)根据参考资料回答问题(Question & Answer)参考资料 基本要求(C.R.E.A.T.E) Character This is th…...

微信消息群发(定时群发)-UI自动化产品(基于.Net平台+C#)

整理 | 小耕家的喵大仙 出品 | CSDN&#xff08;ID&#xff1a;lichao19897314&#xff09; 关联源码及工具下载https://download.csdn.net/download/lichao19897314/90096681https://download.csdn.net/download/lichao19897314/90096681https://download.csdn.net/download/…...

华为HuaweiCloudStack(一)介绍与架构

本文简单介绍了华为HCS私有云解决方案&#xff0c;并从下至上介绍HCS的整体架构&#xff0c;部署架构、部署方式等内容。 目录 HCS简介 HCS架构 纵向结构 ?管理平台类型 HCS节点类型 FusionSphere OpenStack CPS ServiceOM SC 运营面 OC 运维面 HCS部署架构 regi…...

【博客之星】2024年度个人成长、强化学习算法领域总结

&#x1f4e2;在2025年初&#xff0c;非常荣幸能通过审核进入到《2024年度CSDN博客之星总评选》TOP300的年度评选中&#xff0c;排名40。这还是第一次来到这个阶段&#xff0c;作为一名博士研究生&#xff0c;还是备受鼓舞的。在这里我将以回顾的方式讲述一下这一年在CSDN中走过…...

Git 分支策略

文章目录 1. Git Flow2. GitHub Flow3. GitLab Flow4. Trunk-Based Development5. Release Flow分支最佳实践 Git 分支策略是组织和管理工作特性开发、协作和版本控制的技术。选择合适的策略取决于团队规模、项目需求和部署需求。以下是常见的 Git 分支策略&#xff1a; 1. Git…...

《自动驾驶与机器人中的SLAM技术》ch8:基于预积分和图优化的紧耦合 LIO 系统

和组合导航一样&#xff0c;也可以通过预积分 IMU 因子加上雷达残差来实现基于预积分和图优化的紧耦合 LIO 系统。一些现代的 Lidar SLAM 系统也采用了这种方式。相比滤波器方法来说&#xff0c;预积分因子可以更方便地整合到现有的优化框架中&#xff0c;从开发到实现都更为便…...

Mysql学习笔记

连接数据库 找到 MySQL 安装目录下的 bin 目录&#xff0c;然后打开命令窗口&#xff0c;在命令窗口中按如下语法输入命令&#xff1a; mysql - h MySQL 数据库服务器的 IP 地址 - u 用户名 - p 然后按下回车键&#xff0c;输入密码即可 数据库操作 创建数据库 CREAT…...

Safari常用快捷键

一、书签边栏 1、显示或隐藏书签边栏&#xff1a;Control-Command-1 2、选择下一个书签或文件夹&#xff1a;向上头键或向下头键 3、打开所选书签&#xff1a;空格键 4、打开所选文件夹&#xff1a;空格键或右箭头键 5、关闭所选文件夹&#xff1a;空格键或左箭头键 6、更…...

OpenEuler学习笔记(二):用通俗的道理讲操作系统原理

用通俗的道理讲操作系统原理 基础概念类比 把OpenEuler操作系统想象成一个大型的工厂&#xff0c;这个工厂有各种各样的部门&#xff0c;每个部门都有自己的职责&#xff0c;共同协作来让整个工厂正常运转。内核就像是工厂的管理中心&#xff0c;它负责指挥和协调所有的工作。 …...

ros2-7.5 做一个自动巡检机器人

7.5.1 需求及设计 又到了小鱼老师带着做最佳实践项目了。需求&#xff1a;做一个在各个房间不断巡逻并记录图像的机器人。 到达目标点后首先通过语音播放到达目标点信息&#xff0c; 再通过摄像头拍摄一张图片保存到本地。 7.5.2 编写巡检控制节点 在chapt7_ws/src下新建功…...

使用 `scanpy` 观察 `AnnData` 对象内部数据结构

以下是使用 scanpy 观察 AnnData 对象内部数据结构的步骤: 一、导入必要的库: import scanpy as sc二、读取 AnnData 对象: 假设你的 AnnData 对象存储在一个文件中,例如 adata.h5ad,你可以使用以下代码读取它: adata = sc.read(adata.h5ad)如果你已经有了 adata 对象…...

《CPython Internals》阅读笔记:p232-p249

《CPython Internals》学习第 13天&#xff0c;p232-p249 总结&#xff0c;总计 18 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;1) 1.overhead (1)overhead: over-(“above”) head(“top part, uppermost section”) overhead的字面意思是&#xff1a;above…...

Java并发08 - 并发安全容器详解

并发容器详解 文章目录 并发容器详解一&#xff1a;不使用并发容器如何保证安全二&#xff1a;阻塞队列容器2&#xff1a;ArrayBlockingQueue2.1&#xff1a;内部成员2.2&#xff1a;put方法的实现2.3&#xff1a;take方法的实现 3&#xff1a;LinkedBlockingQueue3.1&#xff…...

抽奖系统(3——奖品模块)

1. 图片上传 application.properties 配置上传文件路径 ## 文件上传 ## # 目标路径 pic.local-pathD:/PIC # spring boot3 升级配置名 spring.web.resources.static-locationsclasspath:/static/,file:${pic.local-path} tip&#xff1a; 1. 如果访问的是本地路径&#xff0c…...

36.centos7上安装python3.6.5、安装卸载依赖包

查看openssl的版本号&#xff0c;默认python3.6.5需要OpenSSL 1.0.2以上的版本支持。 监测安装好的python,是否可以正确导入ssl和_ssl包 pip3安装依赖包 通过Pycharm工具导出requirements.txt文件 查看/usr/bin/目录下的软连接 pip3, python...

微透镜阵列精准全检,白光干涉3D自动量测方案提效70%

广泛应用的微透镜阵列 微透镜是一种常见的微光学元件&#xff0c;通过设计微透镜&#xff0c;可对入射光进行扩散、光束整形、光线均分、光学聚焦、集成成像等调制&#xff0c;进而实现许多传统光学元器件难以实现的特殊功能。 微透镜阵列&#xff08;Microlens Array&#x…...

nature genetics | scATAC-seq预测scRNA-seq,识别影响基因表达的新染色质区域

–https://doi.org/10.1038/s41588-024-01689-8 Single-cell multi-ome regression models identify functional and disease-associated enhancers and enable chromatin potential analysis 研究团队和单位 Christina S. Leslie–Memorial Sloan Kettering Cancer Center …...

简述mysql 主从复制原理及其工作过程,配置一主两从并验证。

MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执行这些日志中的操作。 MySQL主从同步是基…...

Java API:封装自定义响应类

本文介绍 Web 服务开发中自定义响应&#xff0c;涵盖标准 HTTP 响应状态码局限性、自定义响应价值、设计原则与实现、在 Spring Boot 项目应用、与其他响应格式对比总结及应用场景。 1. 标准HTTP响应与自定义响应 1.1标准HTTP响应状态码 在 Web 服务开发中&#xff0c;HTTP…...

【Unity3D】利用Hinge Joint 2D组件制作绳索效果

目录 一、动态绳索 &#xff08;可移动根节点&#xff09; 二、静态绳索 三、利用Skinning Editor(Unity2022.3.15f1正常使用) 四、注意事项 一、动态绳索 &#xff08;可移动根节点&#xff09; 动态绳索 DynamicRope空物体 Anchor和whitecircle是相同位置的物体&#xff…...

vim练级攻略(精简版)

vim推荐配置: curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh 0. 规定 Ctrl-λ 等价于 <C-λ> :command 等价于 :command <回车> n 等价于 数字 blank字符 等价于 空格&#xff0c;tab&am…...

嵌入式硬件篇---PID控制

文章目录 前言第一部分&#xff1a;连续PID1.比例&#xff08;Proportional&#xff0c;P&#xff09;控制2.积分&#xff08;Integral&#xff0c;I&#xff09;控制3.微分&#xff08;Derivative&#xff0c;D&#xff09;控制4.PID的工作原理5..实质6.分析7.各种PID控制器P控…...

技术洞察:C++在后端开发中的前沿趋势与社会影响

文章目录 引言C在后端开发中的前沿趋势1. 高性能计算的需求2. 微服务架构的兴起3. 跨平台开发的便利性 跨领域技术融合与创新实践1. C与人工智能的结合2. C与区块链技术的融合 C对社会与人文的影响1. 提升生产力与创新能力2. 促进技术教育与人才培养3. 技术与人文的深度融合 结…...

C语言程序设计之小系统

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 系统说明 1.1 系统概述 1.2 功能模块总体设计详细设计 3.1 程序中使用的函数 3.2各类问…...

pyinstaller : 无法将“pyinstaller”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

pyinstaller : 无法将“pyinstaller”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 所在位置 行:1 字符: 1pyinstaller --onefile --windowed 过年烟花.py~~~~~~~~~~~ …...

接口传参 data格式和json格式区别是什么

接口传参 data格式和json格式区别是什么 以下是接口传参 data 格式和 JSON 格式的区别&#xff1a; 定义和范围 Data 格式&#xff1a; 是一个较为宽泛的概念&#xff0c;它可以指代接口传递参数时所使用的任何数据的组织形式。包括但不限于 JSON、XML、Form 数据、纯文本、二进…...

ClickHouse 入门

简介 ClickHouse 是一个列式数据库&#xff0c;传统的数据库一般是按行存储&#xff0c;而ClickHouse则是按列存储&#xff0c;每一列都有自己的存储空间&#xff0c;并且只存储该列的数值&#xff0c;而不是存储整行的数据。这样做主要有几个好处&#xff0c;压缩率高&#x…...

Python自动化:基于faker批量生成模拟数据(以电商行业销售数据为例)

引言&#xff1a;个人认为&#xff0c;“造数据”是一个数据分析师的一项基本技能&#xff0c;当然啦&#xff0c;“造数据”不是说胡编乱造&#xff0c;而是根据自己的需求去构造一些模拟数据集&#xff0c;用于测试等用途&#xff0c;而且使用虚拟数据不用担心数据隐私和安全…...

3.3 OpenAI GPT-4, GPT-3.5, GPT-3 模型调用:开发者指南

OpenAI GPT-4, GPT-3.5, GPT-3 模型调用:开发者指南 OpenAI 的 GPT 系列语言模型,包括 GPT-4、GPT-3.5 和 GPT-3,已经成为自然语言处理领域的标杆。无论是文本生成、对话系统,还是自动化任务,开发者都可以通过 API 调用这些强大的模型来增强他们的应用。本文将为您详细介…...

【Spring Boot】掌握 Spring 事务:隔离级别与传播机制解读与应用

前言 &#x1f31f;&#x1f31f;本期讲解关于spring 事务传播机制介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话…...

力扣203题—— 移除链表元素

题目 递归法使用 if(headnull){return null; }//假设remove返回后面已经去掉val值的链表 我们用head.next去存放他&#xff0c;接着我们要判断此时head head值是否等于val&#xff0c;如果等于我们就返回后继元素即可 head.nextremove(head.next,val); if(head.valval){return…...

Express中间件

目录 Express中间件 中间件的概念 next函数 全局中间与局部中间件 多个中间件 中间的5个注意事项 中间的分类 应用级中间件 路由级中间件 错误级中间件 Express内置中间件 express.json express.urlencoded 第三方中间件​编辑 自定义中间件 Express中间件 中间…...

【AIGC】SYNCAMMASTER:多视角多像机的视频生成

标题&#xff1a;SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页&#xff1a;https://jianhongbai.github.io/SynCamMaster/ 代码&#xff1a;https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…...

模块化架构与微服务架构,哪种更适合桌面软件开发?

前言 在现代软件开发中&#xff0c;架构设计扮演着至关重要的角色。两种常见的架构设计方法是模块化架构与微服务架构。它们各自有独特的优势和适用场景&#xff0c;尤其在C#桌面软件开发领域&#xff0c;模块化架构往往更加具有实践性。本文将对这两种架构进行对比&#xff0…...

Ubuntu 24.04 LTS 安装 tailscale 并访问 SMB共享文件夹

Ubuntu 24.04 LTS 安装 tailscale 安装 Tailscale 官方仓库 首先&#xff0c;确保系统包列表是最新的&#xff1a; sudo apt update接下来&#xff0c;安装 Tailscale 所需的仓库和密钥&#xff1a; curl -fsSL https://tailscale.com/install.sh | sh这会自动下载并安装 …...

fgets、scanf存字符串应用

题目1 夺旗&#xff08;英语&#xff1a;Capture the flag&#xff0c;简称 CTF&#xff09;在计算机安全中是一种活动&#xff0c;当中会将“旗子”秘密地埋藏于有目的的易受攻击的程序或网站。参赛者从其他参赛者或主办方偷去旗子。 非常崇拜探姬的小学妹最近迷上了 CTF&am…...

C#高级:用Csharp操作鼠标和键盘

一、winform 1.实时获取鼠标位置 public Form1() {InitializeComponent();InitialTime(); }private void InitialTime() {// 初始化 Timer 控件var timer new System.Windows.Forms.Timer();timer.Interval 100; // 设置为 100 毫秒&#xff0c;即每 0.1 秒更新一次timer.…...

关于AI agent的学术论文实验部分:准确率,响应时间,用户满意度

关于AI agent的学术论文实验部分 在撰写关于AI agent的学术论文时,实验设计和实施是关键部分,仅搭建完成AI agent通常是不够的,需要通过严谨的实验来验证其性能、效果和创新性。以下以一个在智能客服场景中应用AI agent的例子,说明如何完成实验: 明确实验目的:确定通过实…...

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言&#xff1a;在当今数字化时代&#xff0c;分布式系统和大数据处理变得愈发普遍&#xff0c;消息队列作为其中的关键组件&#xff0c;承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品&#xff0…...

postgresql表分区及测试

本文主要采用list类型实现表分区&#xff0c;并对表分区数据进行查询对比&#xff0c;数据量6000万条以上&#xff0c;速度相差10倍以上。 一、创建表&#xff0c;以substationcode字段为ist类型表分区 CREATE TABLE "public"."d_population_partition" …...

VUE学习笔记(入门)1__创建VUE实例

核心步骤 <div id"app"><!-- 这里存放渲染逻辑代码 --><h1>{{ msg }}</h1><a href"#">{{count}}</a> </div><!-- 引入在线的开发版本核心包 --> <!-- 引入核心包后全局可使用VUE构造函数 --> <…...

STL—stack与queue

目录 Stack stack的使用 stack的模拟实现 queue queue的使用 queue的模拟实现 priority_queue priority_queue的用法 priority_queue的模拟实现 容器适配器 种类 Stack http://www.cplusplus.com/reference/stack/stack/?kwstack stack是栈&#xff0c;后入先出 stack的…...

pthread_create函数

函数原型 pthread_create 是 POSIX 线程&#xff08;pthread&#xff09;库中的一个函数&#xff0c;用于在程序中创建一个新线程。 #include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *a…...

suctf2025

Suctf2025 --2标识为看的wp&#xff0c;没环境复现了 所有参考资料将在文本末尾标明 WEB SU_photogallery 思路&#x1f447; 构造一个压缩包&#xff0c;解压出我们想解压的部分&#xff0c;然后其他部分是损坏的&#xff0c;这样是不是就可以让整个解压过程是出错的从而…...

二、点灯基础实验

嵌入式基础实验第一个就是点灯&#xff0c;地位相当于编程界的hello world。 如下为LED原理图&#xff0c;要让相应LED发光&#xff0c;需要给I/O口设置输出引脚&#xff0c;低电平&#xff0c;二极管才会导通 2.1 打开初始工程&#xff0c;编写代码 以下会实现BLINKY常亮&…...

ESP8266-01S、手机、STM32连接

1、ESP8266-01S的工作原理 1.1、AP和STA ESP8266-01S为WIFI的透传模块&#xff0c;主要模式如下图&#xff1a; 上节说到&#xff0c;我们需要用到AT固件进行局域网应用&#xff08;ESP8266连接的STM32和手机进行连接&#xff09;。 ESP8266为一个WiFi透传模块&#xff0c;和…...

微服务学习:基础理论

一、微服务和应用现代化 1、时代的浪潮&#xff0c;企业的机遇和挑战 在互联网化数字化智能化全球化的当今社会&#xff0c;IT行业也面临新的挑战&#xff1a; 【快】业务需求如“滔滔江水连绵不绝”&#xff0c;企业需要更快的交付【变】林子大了&#xff0c;百色用户&…...

【c++继承篇】--继承之道:在C++的世界中编织血脉与传承

目录 引言 一、定义二、继承定义格式2.1定义格式2.2继承关系和访问限定符2.3继承后子类访问权限 三、基类和派生类赋值转换四、继承的作用域4.1同名变量4.2同名函数 五、派生类的默认成员构造函数5.1**构造函数调用顺序&#xff1a;**5.2**析构函数调用顺序&#xff1a;**5.3调…...

Java操作Excel导入导出——POI、Hutool、EasyExcel

目录 一、POI导入导出 1.数据库导出为Excel文件 2.将Excel文件导入到数据库中 二、Hutool导入导出 1.数据库导出为Excel文件——属性名是列名 2.数据库导出为Excel文件——列名起别名 3.从Excel文件导入数据到数据库——属性名是列名 4.从Excel文件导入数据到数据库…...