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

JMeter模拟并发请求

        PostMan不是严格意义上的并发请求工具,实际是串行的,如果需要测试后台接口并发时程序的准确性,建议采用JMeter工具。

案例:JMeter设置20个并发卖票请求,查看后台是否存在超卖的情况

 方式一:一共10张票,票余额作为成员属性放在控制器中,没做任何的锁控制

package com.gingko.controller;
import com.gingko.common.GenericWebResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Random;@RestController
@RequestMapping("ticket")
@Slf4j
public class TicketController {private static int TICKET_AMOUNT = 10;//一共10张票@PostMapping("/sell")public GenericWebResult sell() {GenericWebResult result = null;if(TICKET_AMOUNT > 0) {try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}TICKET_AMOUNT--;System.out.println("售票成功:余票" + TICKET_AMOUNT);result = GenericWebResult.ok("售票成功:余票",TICKET_AMOUNT);}else {result = GenericWebResult.error("售票失败:余票",TICKET_AMOUNT);System.out.println("售票失败:余票" + TICKET_AMOUNT);}return result;}
}

运行结果及分析: 

从运行结果可以看出,在高并发的时候,出现了超卖和数据不一致的问题

 方式二:一共10张票,票余额作为成员属性放在控制器中,卖票的请求方法上加锁synchronized

package com.gingko.controller;
import com.gingko.common.GenericWebResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Random;@RestController
@RequestMapping("ticket")
@Slf4j
public class TicketController {private static int TICKET_AMOUNT = 10;//一共10张票@PostMapping("/sell")public synchronized GenericWebResult sell() {GenericWebResult result = null;if(TICKET_AMOUNT > 0) {try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}TICKET_AMOUNT--;System.out.println("售票成功:余票" + TICKET_AMOUNT);result = GenericWebResult.ok("售票成功:余票",TICKET_AMOUNT);}else {result = GenericWebResult.error("售票失败:余票",TICKET_AMOUNT);System.out.println("售票失败:余票" + TICKET_AMOUNT);}return result;}
}

运行结果及分析: 

 从运行结果可以看出,在高并发的时候,没有出现超卖或数据不一致问题,数据结果符合预期。

方式三:TicketController对象多例,并且TICKET_AMOUNT属性不是static,每个对象各自持有

package com.gingko.controller;
import com.gingko.common.GenericWebResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Random;@RestController
@RequestMapping("ticket")
@Slf4j
@Scope("prototype") //多例
public class TicketController {private int TICKET_AMOUNT = 10;@PostMapping("/sell")public GenericWebResult sell() {GenericWebResult result = null;if(TICKET_AMOUNT > 0) {try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}TICKET_AMOUNT--;System.out.println("售票成功:余票" + TICKET_AMOUNT);result = GenericWebResult.ok("售票成功:余票",TICKET_AMOUNT);}else {result = GenericWebResult.error("售票失败:余票",TICKET_AMOUNT);System.out.println("售票失败:余票" + TICKET_AMOUNT);}return result;}
}

运行结果及分析:  

从程序可以看出,20个并发请求,后台生成了20个TicketController实例,每个实例内部都持有属性TICKET_AMOUNT = 10,sell方法执行后,TICKET_AMOUNT = 9

方式一、方式二与方式三示意图区别如下:

方式一、二,堆内存中只有一个TicketController实例,并且TICKET_AMOUNT不属于实例对象,属于共享的数据区,对这种共享数据并发操作时,需要锁机制控制,防止出现数据不一致。

方式三,并发请求多少,堆内存中生成多少个TicketController实例,并且每个TicketController实例各自持有TICKET_AMOUNT,访问各自的成员属性也就不会发生数据不一致问题。

相关文章:

JMeter模拟并发请求

PostMan不是严格意义上的并发请求工具,实际是串行的,如果需要测试后台接口并发时程序的准确性,建议采用JMeter工具。 案例:JMeter设置20个并发卖票请求,查看后台是否存在超卖的情况 方式一:一共10张票&…...

【小趴菜前端实习日记5】

实习日记5 一、vue3中如何使用router(获取this)二、ts中用object定义类型太宽泛导致Ts无法推断出正确类型三、动态设置日记封面失败vite动态引入静态资源1.方法一vue3父子组件生命周期执行顺序 2.方法二3.方法三 四、打包问题总结1.The import.meta meta-property i…...

如何通过谷歌外推占据搜索引擎首页?

外贸企业在推广过程中,如何在谷歌搜索引擎中占据有利位置,获取更多曝光,GLB谷歌霸屏服务就可以派上用场。它通过高效的品牌外推策略,可以让你的企业信息在谷歌中实现“霸屏”效果,特别是长尾关键词的全面覆盖 很多企业…...

jmeter学习(6)逻辑控制器

1. 简单控制器 简单控制器用来存放组件的,没有提供什么逻辑功能。 2. 循环控制器 用来循环执行请求,可以配置循环次数。注意它与线程组、测试计划中的循环是相互独立的,比如在线程组中设置循环2次,循环控制器设置循环3次&#…...

Android14 和android12 在锁屏界面Keyguard输错5次密码后倒计时30秒时重启手机不显示倒计时

参考如下修改:Android9.0在锁屏界面Keyguard输错5次密码后倒计时30秒时重启手机不显示倒计时_android 锁屏密码输错5次-CSDN博客 android 14 修改如下: androidap/SYSTEM/frameworks/base$ git status Refresh index: 100% (47218/47218), done. HEAD d…...

智能时代摩托车一键启动无钥匙进入感受科技前线

向智能化与高性能迈进,技术创新与绿色转型引领摩托车行业智能化出行。 摩托车一键启动无钥匙进入功能是一种先进的车辆控制系统,它允许驾驶员在不使用传统机械钥匙的情况下,通过智能感应技术自动解锁和启动摩托车。这种系统通常包括一个智能钥匙&#x…...

需要补充的技能

密码管理 文件管理 人际管理 Microsoft365 teams和onedrive,outlook,sharepoint等 被问到自己不懂的问题的时候怎么迅速反应快速回答? 被帅锅的时候怎么解决? 谈判技巧? 说话的语速? 遇到解决不了的问题如何处理? 考…...

15分钟学 Go 第 15 天:映射(Map)

第15天:映射(Map) 学习目标 在本节中,我们将深入理解Go语言中的字典类型(映射),通过例子与图示来帮助你掌握其使用方法。我们将涵盖以下几个方面: 概念定义创建和使用映射访问和更…...

element-plus 官方表格排序问题

element-plus 官方API 默认表格排序存在问题,一个list 被多组排序 修改后: 注意点: 这里一定要使用 sortable"custom",自定义 sort-change 方法 使用 sortable true 的情况排序会冲突,出现莫名奇妙的问题…...

AI语音模型在家宽业务中的应用

在运营商家宽业务支撑场景中,存在多个APP和系统需要与装维人员交互,传统的功能按钮点击型操作交互界面,越来越难以满足装维人员工作提效的迫切需求。家宽施工调度系统所需的AI语音能力主要包括ASR(音转字)和TTS&#x…...

零七生活API-文字转语音API使用示例

//官网地址:零七生活API - 提供免费接口调用平台function getAud(){axios({method: get,url: https://api.oick.cn/api/txt?text你好&spd5&apikeyyourApikey,responseType: blob, // 确保 axios 处理为二进制数据}).then((response) > {// 将 Blob 转换…...

rpc的客户端为什么称为stub

1.client为什么是stub Stub 在分布式系统中是一种 代理对象(Proxy Object),它本质上是一个在本地系统中扮演远程服务角色的代理。 在早期的 RPC 术语中,客户端端叫做 Stub,而服务器端的处理部分叫做 Skeleton。这种对…...

RHCE--nginx实现多IP访问多网站

方法一:nmtui 1.目录挂载 2.下载nginx 3.关闭防火墙 4.在一个网卡创建多个虚拟地址 1. 2. 3. 方法二:nmcil 1.手动配置 2.如图所示重新连接后创建ip成功 3.创建目录以及写入 结果...

TikTok运营对IP有什么要求?

TikTok在进行直播带货时,网络环境的配置尤为关键,网络质量直接影响到直播效果,因此选择稳定的IP地址很重要。那么,TikTok直播时该选择什么样的IP地址呢?接下来,我们来深入分析一下。 TikTok对IP地址的要求 …...

大白话讲解:多模态大模型综述,通俗易懂!

多模态大型语言模型(Multimodal Large Language Models, MLLM)的出现是建立在大型语言模型(Large Language Models, LLM)和大型视觉模型(Large Vision Models, LVM)领域不…...

大数据-184 Elasticsearch - 原理剖析 - DocValues 机制原理 压缩与禁用

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

Java设计模式:工厂模式详解

引言 1. 工厂模式的定义 2. 工厂模式的类型 2.1 简单工厂模式 2.1.1 结构 2.1.2 示例代码 2.2 工厂方法模式 2.2.1 结构 2.2.2 示例代码 2.3 抽象工厂模式 2.3.1 结构 2.3.2 示例代码 3. 工厂模式的优点 4. 工厂模式的缺点 5. 实际应用场景 6. 总结 引言 工厂模…...

《Python游戏编程入门》注-第3章1

《Python游戏编程入门》的第三章是“I/O、数据和字体:Trivia游戏”,介绍了print()函数、input()函数、异常处理以及文件的输入输出,最后根据以上内容完成了Trivia游戏。 本章的“3.1 了解Trivia游戏”介绍了Trivia游戏的界面和玩法。“3.2 P…...

Java爬虫:获取数据的入门详解

在数字化时代,数据已成为最宝贵的资产之一。无论是市场研究、客户洞察还是产品开发,获取大量数据并从中提取有价值的信息变得至关重要。Java,作为一种成熟且功能强大的编程语言,为编写爬虫提供了强大的支持。Java爬虫可以帮助我们…...

GAMES104:17 游戏引擎的玩法系统:高级AI-学习笔记

文章目录 课前QA一,层次任务网络(Hierarchical Tasks Network,HTN)1.1 HTN Framework1.2 HTN Task Types1.2.1 Primitive Task基本任务1.2.2 Compound Task符合任务 1.3 Planning1.4 Replan1.5 总结 二,目标导向行为规…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

【JVM】- 内存结构

引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...