利用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

jmeter 插件 redis_Redis


然后,选中‘Redis Data Set’,点击‘Apply Changes and Restart JMeter’

带自动下载redis所需的依赖后重启jmeter。

然后,在jmeter的线程组上右键,添加 > 配置元件 > jp@gc - Redis Data Set

jmeter 插件 redis_数据库_02


此时,已经可以通过jmeter配置连接redis数据库了。如果你已经有了redis数据库,那你就直接可以在当前的界面中进行相关的配置,如果你还没有redis数据库,就需要安装redis数据库。

jmeter使用redis数据

在RedisDataSet中配置相关信息

jmeter 插件 redis_Redis_03


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中

jmeter 插件 redis_jmeter 插件 redis_04

写入测试

创建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");

jmeter 插件 redis_jmeter_05

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’)”
(只测试某些数值存取的性能)