利用Jmeter对redis进行性能测试
- 测试工具准备
- 第一种方式:插件 目前未跑通
- jmeter使用redis数据
- 第二种方式:jar
- 读取测试
- 写入测试
- redis压力测试命令
测试工具准备
Jmeter作为当前非常受欢迎的接口测试和性能测试的工具,在企业中得到非常广泛的使用,而redis作为缓存数据库,也在企业中得到普遍使用,那如何使用jmeter来测试redis数据库呢?
本文讲述如何使用jmeter来调用redis,对redis进行读写操作,其他操作也可参考本文。
Jmeter准备
下载地址:https://jmeter.apache.org/
第一种方式:插件 目前未跑通
由于jmeter本身并没有带有redis的测试入口,我们需要去安装redis插件。
插件地址:https://jmeter-plugins.org/ 首先,我们下载jmeter-plugins-manager-1.6.jar文件,放到jmeter的lib的ext文件夹中,然后重启jmeter。
然后,在‘选项’菜单下,点击‘plugin manager’,打开插件管理弹窗,选择‘Available Plugins’,在搜索框中,输入 redis
然后,选中‘Redis Data Set’,点击‘Apply Changes and Restart JMeter’
带自动下载redis所需的依赖后重启jmeter。
然后,在jmeter的线程组上右键,添加 > 配置元件 > jp@gc - Redis Data Set
此时,已经可以通过jmeter配置连接redis数据库了。如果你已经有了redis数据库,那你就直接可以在当前的界面中进行相关的配置,如果你还没有redis数据库,就需要安装redis数据库。
jmeter使用redis数据
在RedisDataSet中配置相关信息
Data Configuration
Redis key:Redis中的key,Redis数据库中列表(有序数据)或集(无序数据)的名称
Variable Names:由数据集导出到测试元素的变量的名称(设置取出来的value存放在哪个变量中)
Delimiter:存储在Redis列表或集合中的行中使用的分隔符(取出的value有多个值时,变量名之间的分隔符)
Date Sources Type:数据源类型,有List、Set两种选择
Recycle data on Flase: 数据是否重复使用
Connection Configuration
Redis server host:Redis服务器IP地址
Redis server port:Redis服务端口
Timeout for connect in ms: 连接超时时间,默认2000 ms
Password for connection:连接Redis的密码
Database:数据库名称,连接Redis的第几个数据库,默认为0
Redis Pool Configuration
字段 | 用法 | 默认值 |
minldle | 至少有多少个处于空闲状态的redis实例 | 0 |
maxldle | 一个线程池最多有多少个处于空闲状态的redis实例 | 10 |
maxActive | 控制一个pool可分配多少个redis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态就成exhausted | 20 |
maxWait | 表示当borrow一个redis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisconnectionException | 30000 |
whenExhaustedAction | 表示当pool中的redis实例都被allocated完时,pool要采取的操作;默认有三种WHEN_EXHAUSTED_FAIL(表示无redis实例时,直接抛出NoSuchElementException) . WHEN_EXHAUSTED_BLOCK(则表示阻塞住,或者达到maxWait时抛出JedisConnectionException) . WHEN_EXHAUSTED_GROW(则表示新建一个jedis实例,也就说设置的maxActive无用) | False |
testOnBorrow | 在borrow一个redis实例时,是否提前进行alidate操作;如果为true,则得到的redis实例均是可用的 | False |
testOnReturn | 在return给pool时,是否提前进行validate操作 | False |
testWhileldle | 如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义 | False |
timeBetweenEvictionRunsMillis | 表示idle object evitor两次扫描之间要sleep的毫秒数 | 30000 |
numTestsPerEvictionRun | 表示idle object evitor每次扫描的最多的对象数 | 0 |
minEvictableldleTimeMillis | 表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义 | 60000 |
softMinEvictableldleTimeMillis | 在minEvictableldleTimeMillis基础上,加入了至少minldle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableldleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义 | 60000 |
第二种方式:jar
直接下载依赖jar,下载后导入Jmeter安装目录的lib目录下,可先查看是否有jedis依赖的jar包,若有无需再下载。
jedis:https://mvnrepository.com/artifact/redis.clients/jedis/3.6.3
jedispool:https://mvnrepository.com/artifact/org.apache.commons/commons-pool2/2.9.0
读取测试
创建BeanShell取样器
脚本内容:
import redis.clients.jedis.Jedis;
import java.util.ArrayList;
import org.apache.commons.lang3.StringUtils;
String host = "127.0.0.1"; //服务器地址
int port = 6739; //端口号
String password = "password"; //redis密码
int index = 0; //redis db,默认为0
String key = "8841"; //key值,需要读取数据的键值
Jedis jedis = new Jedis(host, port);
if(StringUtils.isNotBlank(password)){
jedis.auth(password);
}
jedis.select(index); //选择redis db
String value= jedis.get(key); //通过key值获取对应value
vars.put("code",value); //将获取的value值保存到jmeter变量code中
写入测试
创建JSR223 Sampler取样器
脚本内容:
import redis.clients.jedis.Jedis;
Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.auth("password");
jedis.set("8841","bar");
String value = jedis.get("8841");
redis压力测试命令
1.redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000(100个并发连接,100000个请求)
2.redis-benchmark -h 127.0.0.1 -p 6379 -q -d 100(存取大小为100字节的数据包)
3.redis-benchmark -t set, lpush -n 100000 -q (只测试某些操作的性能)
4.redis-benchmark -n 100000 -q script load “redis.call(‘set’,‘foo’,‘bar’)”
(只测试某些数值存取的性能)