如皋做网站的公司/漯河搜狗关键词优化排名软件
JMeter高级使用
案例:
- 用户登录后-选择商品-添加购物车-创建订单-验证结果
问题:
- JMeter测试中,验证结果使用断言,但断言都是固定的内容
- 假如要判断的内容(预期内容)是在变化的, 有时候还是不确定的, 那该怎么办呢?
解决:
- 1.通过查询数据库获取动态的结果
- 2.使用beanshell断言进行结果验证
实现步骤:
-
创建登录接口HTTP请求
-
创建添加购物车接口HTTP请求
-
创建订单接口HTTP请求,通过数据查看订单号
-
对订单接口结果验证,是否创建订单号
-
查询数据库获取结果
-
使用beanshell断言进行动态结果验证
-
1. JMeter连接数据库
1.1 数据库配置信息
配置信息:
- ip:192.168.1.242
- port:7090
- 用户名:test
- 密码:test123456
- 数据库名称:xxxx
可使用数据库连接工具进行连接,例如:navicat
1.2 连接数据库
- 元件
JDBC Connection Configuration
进行连接数据库
实现步骤:
-
1.下载MySQL的jdbc驱动(mysql-connector-java.jar)
- https://mvnrepository.com/artifact/mysql/mysql-connector-java
- 将其放到放在指定的目录,或者放在 …\apache-jmeter\lib\ 目录下
- https://mvnrepository.com/artifact/mysql/mysql-connector-java
-
在测试计划下添加驱动地址
-
-
备注:
- 如果放在jmeter/bin目录,则不需要在测试计划下添加jar包
-
-
选择线程组-添加-配置原件-JDBC Connection Configuration
-
主要配置
- Variable Name Bound to Pool
- 配置变量名称
- Variable Name不能为空
- Database connection
- DataBase URL 格式为:jdbc:mysql://服务器ip:端口号/数据库
- 在数据库后加参数?allowMultiQueries=true,可同时执行多条mysql语句;否则报错
- select语句中含有中文字符的缘故,jmeter识别不了。
- 解决办法:就是在JDBC 的连接中,增加useUnicode=true&characterEncoding=utf8
- Variable Name Bound to Pool
-
jdbc:mysql://211.103.136.242:7090/db-name test test123456
-
-
添加JDBC Request
- 添加-> 取样器-> JDBC Request
- 添加变量和查询语句
- 变量名必须和JDBC Connection Configuration中的变量名保持一致
- 添加-> 取样器-> JDBC Request
-
-
查询语句
-
select order_id from tb_order_info where user_id='1' order by order_id desc limit 3
-
-
Variable names:将查询结果当做一个参数使用
-
查出来的数据有好些内容,调用方式
``` 取数据第1值调用:$ {test_01} 取数据第5值调用:$ {test_05} 取数据第n值调用:$ {test_n}
2. Beanshell使用
2.1 介绍
什么是Bean Shell?
-
BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
-
BeanShell是一种松散类型的脚本语言(这点和JS类似);
-
BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k。
-
BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。
官网:http://www.BeanShell.org/
JMeter中用BeanShell的好处
- JMeter也是由java编写的,而java运行时需要先编译,然后才可以运行
- 而BeanShell是一款解释器,直接可能运行源代码
BeanShell在JMeter的作用
- 对JMeter的功能的扩展
- 对jmeter变量的一些操作
2.2 Jmeter有哪些BeanShell
- 定时器: BeanShell Timer
- 前置处理器:BeanShell PreProcessor
- 取样器: BeanShell Sampler
- 后置处理器:BeanShell PostProcessor
- 断言: BeanShell断言
- 监听器: BeanShell Listener
备注:
- 一般归属于线程组或逻辑控制器,相对独立
- 而BeanShell PreProcessor和BeanShell PostProcessor归属于sampler(取样器)
- 前者是固定在sampler运行前运行
- 后者是在sampler运行后运行,二者都依赖于sampler而存在
- BeanShell断言同样依赖于sampler,作用是断言sampler是否成功
应用场景:
- 生成变量
- 解析响应结果
- 定制化逻辑处理
- Beanshell还常用于请求发送前后的加密解密
2.3 Bean Shell常用内置变量
JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量
-
log
- 打印日志
-
ctx
- 该变量引用了当前线程的上下文
-
vars - (JMeterVariables)
- 操作jmeter变量
-
props - (JMeterProperties)
- 操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性
-
prev - (获取sample返回的信息)
- 获取前面的sample返回的信息
-
Response
- 获取Response对象,能通过这个对象获取响应信息
-
Failure
- 查看接口调使用能否成功,假如返回false是成功的,true是失败的
-
FailureMessage
- 失败信息,没有设置的时候失败信息是空的,可自定义相关信息
-
ResponseCode
- 返回接口code成功是200
-
SampleLabel
- 获取接口请求的名称
-
SamplerData
- 获取请求的url和body
备注:
- 变量只对当前线程组有效,属性是全局的。变量和属性的值只能是字符串。
2.4 内置变量详解介绍
2.4.1 log
介绍
- 用于打印日志,最常用,也最简单;
- 打印在 jmeter.log 中,可以设置打印级别,可以打印字符串、变量等。
使用方法
参考:http://excalibur.apache.org/apidocs/org/apache/log/Logger.html
-
打印 info 形式的普通字符串日志:
log.info("hello world"); #输出 hello world
-
拼接字符串和变量 (其中 token 是 jmeter 局部变量):
log.info("hello world" + "${token}"); #输出 hello world 和 token 变量的拼接结果
-
打印自定义变量
str = "hello world"; log.info(str); #输出 hello world
-
打印 error 形式的普通字符串日志,修改JMeter日志输出级别,否则看不到
log.error("ERROR-ERROR");
备注:
- print() 打印日志
- print() 是在控制台中输出信息,log() 默认是在 jmeter.log 中输出信息
- 日志文件在安装路径下bin\Jmeter.log中
2.4.2 vars
介绍
- 用于存取 jmeter 局部变量
- 通常用于存取字符串内容,也可以存取对象;
使用方法
参考:http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html
-
获取变量
- vars.get()
-
String key = vars.get("name"); #获取变量名为 name 的值,并保存在 key 中
-
保存变量
-
vars.put()
vars.put("name","value"); #把变量 name(值为 value)保存到jmeter变量中
-
-
对象保存JMeter变量中
-
vars.putObject()
vars.putObject("Object_name",new Object()); 把对象Object_name保存到jmeter变量中
-
-
变量删除
-
vars.remove()
vars.remove("name"); #从jmeter变量中删除name
-
print() 是在控制台中输出信息,log() 默认是在 jmeter.log 中输出信息。
备注:
-
bean shell提供了一个内置变量Parameters,来保存参数的集合
-
log.info(Parameters);
-
-
Parameters
-
#输入${name1}${name2} #脚本 //打印 log.info("传递的参数列表"+Parameters); log.info("name1:"+bsh.args[0]);log.info("name2:"+bsh.args[1]); log.info("name3:"+bsh.args[2]); log.info("name3:"+bsh.args[3]); //获取参数传递过来的值存在变量里 vars.put("v1","bsh.args[1]"); vars.put("v2","bsh_args[2]"); vars.put("v3","bsh_args[3]");log.info("v1:"); log.info("v2:"); log.info("v3:");
-
2.4.3 props
介绍:
- 设置 jmeter 全局的静态变量;
使用方法:
-
获取属性变量
-
props.get
-
ymd = props.get("START.YMD"); #获取属性 START.YMD 的值(脚本启动日期) #其中的 key 和 value 均是字符串形式;
-
-
存入全局属性
-
props.put
-
props.put("token","12ddb123")
-
-
判断某属性是否存在, 返回布尔值
`props.containsKey(``"PROPERTY_NAME"``) `
- 判断某项值是否存在,返回布尔值:
props.contains("PROPERTY_VALUE")
- 删除某个值
props.remove("PROPERTY_NAME")
- 所有属性以字符串形式表示
props.toString()
备注:
- 操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象
- 变量只对当前线程组有效,属性props是全局的
- 变量和属性的值只能是字符串
2.4.4 ctx/prev
介绍:
- ctx当前线程的上下文信息
- prev等同于ctx.getPreviousResult,通过prev可以直接获取前一个取样器返回的信息
使用方法:
参考:ctx:http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html
参考:prev:http://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html
- prev.getResponseDataAsString():获取响应信息
- prev.getResponseCode() :获取响应code
String response_data = prev.getResponseDataAsString();
log.info("res:"+response_data);
String response_code = prev.getResponseCode();
log.info("res_code:"+response_code);
2.4.5 其它
使用方法:
参考:http://jmeter.apache.org/api/org/apache/jmeter/samplers/Sampler.html其它
-
ResponseCode响应码
- 代码:
ResponseCode = 500;
- 结果
-
ResponseMessage响应结果
-
代码
-
ResponseMessage="自定义返回结果"
-
结果
-
-
SampleResult
-
代码
-
SampleResult.setResponseData("Hello world");
-
与ResponseMessage功能类似
-
-
IsSuccess设置返回是否成功
-
代码
-
IsSuccess=false
-
结果
-
-
Label取样器的名称
log.info(Label);
-
Sample
通过sampler来访问当前取样器;
使用方法参考:http://jmeter.apache.org/api/org/apache/jmeter/samplers/Sampler.html
2.4.6 Beanshell线程共享变量
分析:
-
变量只对当前线程组有效,属性是全局的
-
使用beanshell把变量设置为全局变量
线程共享变量
-
Beanshell取样器设置全局属性
-
使用函数助手
-
${__setProperty(authorizations,${token},)}
-
使用props
-
props.put("authorizations","${token}")
-
-
其它线程组通过
JWT ${__property(authorizations,,)}
-
HTTP响应信息头更新
- JWT ${__property(authorizations,)}
JMeter中线程间共享变量可以通过定义属性值来完成,JMeter启动时会读取一些属性文件,比如jmeter.properties、user.properties,这些属性
值是可以增加的,也可以修改的,通过BeanShell可以对其进行更改。
以BeanShell Sampler为例,在其中通过props.put()来增加属性,props.get()来获取属性。
在其它Sampler中,比如Java Sampler中通过 ${__property(【属性名称】,)}来获取。
2.5 Beanshell
通过Beanshell Sampler,测试人员可以编写一些特定逻辑生成的数据,并且通过vars.get、vars.put 或者props.get、props.put 把相应的变量传递到Jmeter脚本当中
vars.get(String,String) 可以获取Jmeter中已经生成的变量
vars.put(String,String) 可以创建和更新Jmeter变量
props.get(String,String) 可以获取Jmeter中已经生成的属性
props.put(String,String) 可以创建和更新Jmeter属性
vars和props的区别是前者是变量,只能在同一线程组内传递,后者是属性,可以在整个测试计划中跨线程组传递。
beanshell参数详解:
-
勾选每次调用前重置,里面定义的变量就会被重置。
-
脚本文件可以导入beanshell脚本
- 调用java文件
java源文件
public class Myclass
{public int add(int a, int b){return a + b;}
}
步骤:
- 在bean shel中通过source(“代码路径”)方法引入java,然后调用方法和java一样,new一个class,再调用里面的add 方法
//引入java文件 source将一个bsh脚本读到解释器或运行在另一个解释器
source("/TEST/Test.java");//绝对路径
//调用方法,语法和java一样
int res = new Test().add(1,2);
//保存变量
vars.put("add",res.toString());
-
引入外部class文件
直接把上例中的java文件编译成class文件
用addClassPath(“D:\”)方法引入 class文件,在用import导入包及类,然后就可以像java一样调用了
//引入class文件
addClassPath("/Users/wuyanhong/Desktop/提升小课/接口测试零基础入门/代码/");
//导入类名
import MyClass;
//调用
int res = new MyClass().add(1,2);
//保存变量
vars.put("add",res.toString());
//打印变量
log.info(vars.get("add"));
案例1:获取当前时间格式为yyyy-MM-dd HH:mm:ss
下面举例写展示当前日期:开发给个接口需要传递当前时间格式为yyyy-MM-dd HH:mm:ss
import java.util.*;import java.text.*;Date d = new Date();DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateStr = df.format(d);vars.put("current_date",dateStr); //给jmeter添加一个变量,内置变量
2.6 Beanshell断言
BeanShell断言可以使用beanshell脚本来执行断言检查,可以用于更复杂的个性化需求,使用更灵活,功能更强大,但是要能够熟练使用beanshell脚本。
在这里除了可以使用beanshell的内置变量外,主要通过Failure和FailureMessage来设置断言结果。
- Failure = false;-----表示断言成功
- Failure = true;-----表示断言失败
- FailureMessage = “……”;-----自定义的失败信息。
实现步骤:
-
在保存订单接口下添加beanshell断言
-
编写断言代码
-
//数据库的取值与接口正则取值比对 if("${db_order_id_1}".equals("${order_id}_1")) {Failure=false;System.out.println("OK"); } else { Failure=true;FailureMessage="不一致"; }
-
参数详解:
- bsh.args[0],bsh.args是一个数组,里面保存的是beanshell【参数】输入框中保存的变量
- 参数:可以将其他元件中已经定义的变量作为参数传给beanshell脚本,传入的参数被存在bsh.args数组中
- 脚本文件:可以从文件导入脚本,而不是直接写。
- 脚本:直接编写beanshell代码
2.7 BeanShell PreProcessor
测试中接口请求参数大部分需要加密后请求,处理需要加密的参数就需要用到jmeter中的前置处理器BeanShell PreProcessor
案例:实现登录密码加密并请求登录接口
-
在eclipse写好md5加密的代码,然后打成jar包(选中该类点击右键->Export->jar file)
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;public class MD5 {public static String getMD5(String sourceStr) {try {MessageDigest md = MessageDigest.getInstance("MD5");//获取MD5实例md.update(sourceStr.getBytes());//此处传入要加密的byte类型值byte[] digest = md.digest();//此处得到的是md5加密后的byte类型值int i;StringBuilder sb = new StringBuilder();for (int offset = 0; offset < digest.length; offset++) {i = digest[offset];if (i < 0)i += 256;if (i < 16)sb.append(0);sb.append(Integer.toHexString(i));//通过Integer.toHexString方法把值变为16进制}return sb.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}public static void main(String []args){String res = MD5.getMD5("123456");System.out.println(res);}}
-
把打好的jar包放到jmeter目录下的apache-jmeter目录的lib\ext下;
-
添加前置处理器-BeanShell PreProcessor
-
编写代码
-
import boxuegu.MD5; String res = new MD5().getMD5("123456"); System.out.println(res); vars.put("md5_pwd",res.toString());
//把加密后的密码存到jmeter变量中,然后在http sampler中就可通过${}使用:
-
执行测试
2.8 BeanShell PostProcessor
获取响应结果,关联操作
下载解析jar包:https://mvnrepository.com/artifact/com.alibaba/fastjson/1.2.62
步骤:
- 获取响应,把响应结果转为json对象
- 获取响应参数,并打印断言结果
- 设置变量
代码:
//1.获取响应,把响应结果转为json对象
String response_data = prev.getResponseDataAsString();
JSONObject data_obj = new JSONObject(response_data);
log.info("res:"+response_data);
//2.获取响应参数,打印断言结果
String name=data_obj.get("username").toString();
log.info("name:"+name);
vars.put("username",name);
//3.判断结果
if(name.equals("python")){log.info("成功");
}
else
{ log.info("失败");
}
总结:
拓展:
beanshell中参数传递一般指的是先获取到参数,再传递参数。在beanshell中传递参数一般使用vars.put(key,value)方法。
注意:
1.vars.get()不能接收int参数
2.vars.put(key,value)中,key要用双引号""括起来
3. 并发测试
- ”并发测试”理解为性能测试,但接口测试中并发测试仅关注于并发测试系统的返回结果是否正确
- 并不关心相关的性能指标,例如系统资料、服务器响应时间等等
- 为了实现并发,我们可以在需要压力的地方设置集合点,每到输入用户名和密码登录时,所有的虚拟用户都相互之间等一等,然后一起访问
3.1 集合点
jmeter里面的集合点通过添加定时器同步定时器
启动:
-
点击线程组,右键点击添加->定时器->同步定时器
用法:
-
模拟用户组的数量:集合多少人再执行请求(也就是执行的线程数)
注意:等同于设置为线程数,一定要确保设置的值不大于它所在线程组包含的用户数 -
超时时间以毫秒为单位:指定人数 多少秒没交集合到算超时(设置延迟时间以毫秒为单位)
- 注意:如果设置timeout in milliseconds为0,表示无超时时间,会一直等下去。
- 线程数量无法达到"Number of Simultaneous Users to Group by"中设置的值,那么Test将无限等待,除非手动终止。
-
如果希望定时器仅用于其中一个取样器,则把该定时器作为子节点加入
-
如果是作用于多个,放置请求之前
相关文章:

JMeter接口测试-5.JMeter高级使用
JMeter高级使用 案例: 用户登录后-选择商品-添加购物车-创建订单-验证结果 问题: JMeter测试中,验证结果使用断言,但断言都是固定的内容假如要判断的内容(预期内容)是在变化的, 有时候还是不确定的, 那该怎么办呢? 解决&…...

网络安全大模型开源项目有哪些?
01 Ret2GPT 它是面向CTF二进制安全的工具,结合ChatGPT API、Retdec和Langchain进行漏洞挖掘,它能通过问答或预设Prompt对二进制文件进行分析。 https://github.com/DDizzzy79/Ret2GPT 02 OpenAI Codex 它是基于GPT-3.5-turbo模型,用于编写…...

【赠书第18期】人工智能B2B落地实战:基于云和Python的商用解决方案
文章目录 前言 1 方案概述 2 方案实施 2.1 云平台选择 2.2 Python环境搭建 2.3 应用开发与部署 2.4 应用管理 2.5 安全性与隐私保护 3 方案优势与效益 4 推荐图书 5 粉丝福利 前言 随着云计算技术的快速发展,越来越多的企业开始将业务迁移至云端&#x…...

《昇思25天学习打卡营第24天》
接续上一天的学习任务,我们要继续进行下一步的操作 构造网络 当处理完数据后,就可以来进行网络的搭建了。按照DCGAN论文中的描述,所有模型权重均应从mean为0,sigma为0.02的正态分布中随机初始化。 接下来了解一下其他内容 生成…...

KeePass密码管理工具部署
KeePass密码管理工具部署 安装包下载入口 双击执行,根据提示完成安装: 安装完成后如图:...

C#中导出dataGridView数据为Excel
C#中导出dataGridView数据为Excel #region 导出Excel功能函数 /// <summary> /// dataGridView 导出Excel功能函数 /// </summary> /// <param name"dataView">dataGridView数据表</param> /// <param name"filePath">路径…...

算法学习6——贪心算法
什么是贪心算法? 贪心算法是一种在每一步选择中都采取当前状态下最优或最有利的选择的算法。其核心思想是通过一系列局部最优选择来达到全局最优解。贪心算法广泛应用于各种优化问题,如最短路径、最小生成树、背包问题等。 贪心算法的特点 局部最优选…...

【C++】标准库:介绍string类
string 一.string类介绍二.string类的静态成员变量三.string类的常用接口1.构造函数(constructor)2.析构函数(destructor)3.运算符重载(operator)1.operator2.operator[]3.operator4.operator 4.string的四…...

未来不会使用 AI 的人真的会被淘汰吗?
AI 是今年大火的一个话题,随着 ChatGPT 之类的一系列大模型开始流行以后,有不少的培训机构宣称这样的口号: “未来不会使用 AI 的人将会被淘汰”。我觉得这个观点本身并没有错,但是关键在于那些培训机构出于自身的利益,故意忽略了…...

K8S及Rancher部署
前言 这篇文写的有点子啰嗦,甚至为了控制篇幅我还分出了其他好几篇文章,只在本文中保留了我认为必须存在。而之所以篇幅这么长,一方面是我在相关领域完全新手,啥啥都不会;而另一方面是我所参考的资料都过于精简&#…...

Qt Creator使用git管理代码
1.在GitHub中新建仓库,设置好仓库名后,其它的设置默认即可。 2.打开git bash,输入以下命令: git config --global user.name "xxxxx" #设置你的GitHub用户名 git config --global user.email "xxxxxxxxx.…...

pandas教程:pandas读取csv文件并指定字段数据类型
文章目录 pandas指定数据类型处理数据类型错误parse_dates参数pandas数据类型处理示例pandas指定数据类型 在读取csv文件时,我们可以使用dtype参数来指定每个列的数据类型。这个参数接受一个字典类型的值,其中键是列名,值是数据类型。数据类型可以是Pandas类型或NumPy类型,…...

c#中使用数据验证器
前言 在很多情况下,用户的输入不一定满足我们的设计要求,需要验证输入是否正确,传统的方案是拿到控件数据进行逻辑判定验证后,给用户弹窗提示。这种方法有点职责延后的感觉,数据视图层应该很好的处理用户的输入。使用…...

Java真人版猫爪老鼠活动报名平台系统
🐾“真人版猫爪老鼠活动报名平台系统”——趣味追逐,等你来战!🐭 🐱【萌宠变主角,现实版趣味游戏】 厌倦了电子屏幕的虚拟游戏?来试试“真人版猫爪老鼠活动”吧!在这个平台上&…...

Git原理与用法系统总结
目录 Reference前言版本控制系统Git的诞生配置Git配置用户名和邮件配置颜色配置.gitignore文件 Git的基础用法初始化仓库克隆现有的仓库添加暂存文件提交变动到仓库比较变动查看日志Git回退Git重置暂存区 Git版本管理重新提交取消暂存撤销对文件的修改 Git分支Git分支的优势Git…...

连载|浅谈红队中的权限维持(六)-Linux 主机后门与Linux 隐藏文件
本文来源无问社区,更多实战内容,渗透思路可前往查看http://www.wwlib.cn/index.php/artread/artid/11584.html 0x01 Linux 主机后门 1、添加用户 一句话添加用户 useradd test;echo -e "123456n123456n" |passwd test 或者使用 openssl …...

tomato-靶机渗透
tomato-靶机 一、安装靶机环境 下载双击.ova文件,写文件名路径导入 打开虚拟机用NAT模式 编辑–>虚拟网络编辑器查看IP段 二、信息收集 1.御剑端口扫描查找该虚拟机的IP 访问网站 扫目录 dirb http://192.168.30.130 收集到目录 /server-status /antibot_im…...

git的配置使用
第三周 Tursday 早 git日志的安装使用 [rootweb ~]# yum -y install git.x86_64 //安装软件包 [rootweb ~]# rpm -ql git //查看git的包 [rootweb ~]# mkdir /yy000 //创建新目录 [rootweb ~]# cd /yy000/ [rootweb yy000]# git init //将当前目录做为仓库…...

【1.0】drf初识
【1.0】drf初识 【一】前后端开发模式 【1】前后端混合开发 【示例】flask混合、django混合【案例】bbs项目 模板:dtl语法(django template language)模板语法 {{}} /{% %}后端渲染 qs对象–遍历循环到模板中–使用模板语法渲染渲染完成后 得到纯粹的…...

SparkSQL---编程模型的操作,数据加载与落地及自定义函数的使用
一、SparkSQL编程模型的创建与转化 1、DataFrame的构建 people.txt数据: 1 zhangsan 20 2 lisi 29 3 wangwu 25 4 zhaoliu 30 5 tianqi 35 6 kobe 40 people.json数据:在SparkSQL—简介及RDD V.S DataFrame V.S Dataset编程模型详解里 1、从Spark数据…...

文件解析漏洞--IIS--Vulhub
文件解析漏洞 一、IIS解析漏洞 用windowserver2003安装IIS测试 1.1 IIS6.X 方法一:目录解析 在网站下建立文件夹的名字为.asp/.asa的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。 1.txt文件里是asp文件的语法查看当前时间 方…...

你知道缓存的这个问题到底把多少程序员坑惨了吗?
在现代系统中,缓存可以极大地提升性能,减少数据库的压力。 然而,一旦缓存和数据库的数据不一致,就会引发各种诡异的问题。 我们来看看几种常见的解决缓存与数据库不一致的方案,每种方案都有各自的优缺点 先更新缓存&…...

飞创直线模组桁架机械手优势及应用领域
随着工业自动化和智能制造的发展,直线模组桁架机械手极大地减轻了人类的体力劳动负担,在危险性、重复性高的作业环境中展现出了非凡的替代能力,引领着工业生产向自动化、智能化方向迈进。 一、飞创直线模组桁架机械手优势 飞创直线模组桁架…...

TongHttpServer 简介
1. 概述 随着网络技术的飞速发展,高并发大用户场景越来越普遍,单一应用服务节点已经不能满足并发需求,为了提高整个系统可靠性,扩展性,吞吐率,通常将多个应用服务器通过硬负载/软负载组成集群,负载均衡器根据不同负载算法将请求分发到各个应用服务器节点。 Tong…...

回溯法---组合总和
题目: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限…...

将Android Library项目发布到JitPack仓库
将项目代码导入Github 1.将本地项目目录初始化为 Git 仓库。 默认情况下,初始分支称为 main; 如果使用 Git 2.28.0 或更高版本,则可以使用 -b 设置默认分支的名称。 git init -b main 如果使用 Git 2.27.1 或更低版本,则可以使用 git symbo…...

JAVAWeb实战(后端篇)
因为前后端代码内容过多,这篇只写后端的代码,前端的在另一篇写 项目实战一: 1.创建数据库,表等数据 创建数据库 create database schedule_system 创建表,并添加内容 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------…...

【vs】实用调试技巧——学会写优秀的代码!
🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、什么是BUG? 三、调试是什么?有多重要? 一名优秀…...

数组声明方式
数组声明方式 一、 一维数组 元素数据类型[] 数组名; // 推荐元素数据类型 数组名[]; 二、 二维数组 元素数据类型[][] 数组名称; // 推荐元素数据类型 数组名称[][];元素数据类型[] 数组名称[]; 注: 对于第三种方式元素数据类型[] 数组名称[];,可…...

Docker中Docker网络-理解Docker0与自定义网络的使用示例
场景 CentOS7中Docker的安装与配置: CentOS7中Docker的安装与配置_centos docker sock-CSDN博客 在上面安装好Docker之后。 关于对Docker中默认docker0以及自定义网络的使用进行学习。 注: 博客:霸道流氓气质-CSDN博客 实现 理解dock…...