JmeterRedisSampler.jar 戳我下载 或者使用下面的代码自行编译成jar包即可。
如何自定义开发java sampler的教程可以访问此处,如果您对自己开发java sampler 有了解请自己继续阅读。
http://www.hissummer.com/loadtesting-jmeter/241-jmetersample.html
1. JavaRedisSampler.jar 放到 ${jmeter_home}/lib/ext 下
1)支持redis cluster
2) 支持 redis standalone
备注: 如果ext 下有 JMeterPlugins-ExtrasLibs.jar (jmeter-plugins 的插件) 先移走, 和 Jedis 最新的库v2.8有冲突。
2. jedis-2.8.0.jar 放到 ${jmeter_home}/lib/ 下, 把 旧的jesis版本移走该目录。
备注: RedisSampler 基于 jedis-2.8.0 开发,所以最好将jmeter原来的旧版本更换为新的版本。
3. JmeterRedis.rar 是 源代码
4. redis.jmx 是脚本例子
5. 源代码如下或者直接下载附件后解压,其中的JmeterRedis.rar 为源代码。 下载地址见这里。
6. 使用示例。
添加redissampler 后,需要填写如下参数。
- 1)redisServerList 示例 ip:port,ip:port (如果当 isCluster 为 true时,这里可以填写多个,逗号分隔。 如果为false,只填写一个即可。
- 2) isCluster , true 或者 false。 表示是否为cluster模式。 如果是false,则就是 standalone模式。
- 3) method , 仅支持 get 和 setex 两条命令。
- 4) key 这里仅指定key的前缀, 后面部分uuid自动生成。 即 key_${uuid生成部分} key仅是前缀的定义。
- 5) value 当setex的时候,value为set的值。 get时不使用该参数。
- 6) isPersist , isPersist 为true时, 则 setex 的该key 没有失效时间。即ttl 为 -1 , 如果为false,则会有expired的情况。
JavaRedisSampler.class
package com.hissummer.redis.test;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.log.Logger;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
public class JmeterRedisSampler extends AbstractJavaSamplerClient{
/**
* 输出到Jmeter控制台的日志类.
* 需要引用Jmeter lib目录下的logkit-2.0.jar.
*/
private Logger log = getLogger();
/**
* 运行结果.
*/
private SampleResult results;
/**
* Jmeter控制台输入的参数.
*/
private String redisServerList;
private String method;
private String key;
private String value;
private boolean checkparameter;
private Set HostandPort ;
private String response;
private boolean isCluster;
private boolean isPersist;
private long startime;
private long endtime;
private StringBuilder ret;
private Object redisclient ;
/**
* 初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行,
* 类似于LoadRunner中的init方法.
*/
public void setupTest(JavaSamplerContext arg0) {
//log.info("execute setupTest...");
checkparameter = true;
HostandPort = new HashSet();
redisServerList = arg0.getParameter("redisServerList", "");
method = arg0.getParameter("method", "");
response = "not found the key";
//key = arg0.getParameter("key", "");
//value = arg0.getParameter("value", "");
isPersist = arg0.getParameter("isPersist","").equals("true")?true:false;
isCluster = arg0.getParameter("isCluster", "").equals("true")?true:false;
ret = new StringBuilder();
Iterator itr = arg0.getParameterNamesIterator();
while(itr.hasNext()) {
String element = (String) itr.next();
if(arg0.getParameter(element,"").equals(""))
{
//log.info(element+" 参数为空");
checkparameter=false;
}
String tempString = element + ":" + arg0.getParameter(element,"")+"\n";
//log.info(tempString);
ret.append(tempString);
}
String[] servers = redisServerList.split(",", -1);
for(int i = 0 ; i < servers.length ; i++)
{
String[] hostandport = servers[i].split(":",-1);
if(!hostandport[0].equals("") && !hostandport[1].equals(""))
HostandPort.add(new HostAndPort(hostandport[0],Integer.valueOf( hostandport[1])));
else {
// log.info(" host or port 不应该为空"+hostandport[0]+hostandport[1]);
checkparameter= false;
}
}
if(servers.length > 1 && !isCluster)
{
//log.info(" 多个redis server但未设置集群模式");
checkparameter=false;
}
if(isCluster)
{
redisclient = new JedisCluster(HostandPort);
}
else
{
Iterator iter = HostandPort.iterator();
HostAndPort first = (HostAndPort) iter.next();
redisclient = new Jedis(first.getHost(),first.getPort());
}
}
/**
* 设置传入的参数,可以设置多个,已设置的参数会显示到Jmeter的参数列表中.
*/
public Arguments getDefaultParameters() {
//log.info("execute getDefaultParameters...");
Arguments params = new Arguments();
/*
* 定义一个参数,显示到Jmeter的参数列表中,
* 第一个参数为参数默认的显示名称,
* 第二个参数为默认值
*/
params.addArgument("redisServerList", "127.0.0.1:6379");
params.addArgument("isCluster", "false");
params.addArgument("method", "setex|get|ttl...");
params.addArgument("key", "key");
params.addArgument("value", "value");
params.addArgument("isPersist", "false");
return params;
}
/**
* 测试执行的循环体,根据线程数和循环次数的不同可执行多次,类似于LoadRunner中的Action方法
* [email protected] // ]]> }
*/
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
//log.info("execute runTest...");
// //定义一个事务,表示这是事务的起始点,类似于LoadRunner的lr.start_transaction
//
// //定义一个事务,表示这是事务的结束点,类似于LoadRunner的lr.end_transaction
//
key = arg0.getParameter("key", "")+ new BigInteger(130, new SecureRandom()).toString(32);
value = arg0.getParameter("value", "");
startime = new Date().getTime();
results = new SampleResult();
//log.info("init..." + results.getTime() + " "+ results.getStartTime()+ " "+results.getEndTime());
results.sampleStart();
//log.info("after start..." + results.getTime() + " "+ results.getStartTime()+ " "+results.getEndTime());
results.setSamplerData(ret.toString()+" \n actualkey: "+key );
// 如果参数有一项为空检查错误,则直接返回错误
if(!checkparameter) {log.info("fail..."); results.setSuccessful(false); return results;}
if(isCluster)
{
if(method.equals("setex")){
response = ((JedisCluster) redisclient).setex(key, 5000, value);
if(isPersist)
((JedisCluster) redisclient).persist(key);
}
else if(method.equals("get"))
response = ((JedisCluster) redisclient).get(key);
else if(method.equals("ttl"))
response = String.valueOf(((JedisCluster) redisclient).pttl(key));
else log.info("暂不支持此命令...");
}
else
{
if(method.equals("setex"))
{
response = ((Jedis) redisclient).setex(key, 5000, value);
if(isPersist)
((Jedis) redisclient).persist(key);
}
else if(method.equals("get"))
response = ((Jedis) redisclient).get(key);
else if(method.equals("ttl"))
response = String.valueOf(((Jedis) redisclient).pttl(key));
else log.info("暂不支持此命令...");
}
if(null == response) response = "not found the key";
results.setResponseData(response, "utf-8");
results.setSuccessful(true);
results.setResponseCodeOK();
results.setEndTime(System.currentTimeMillis());
//results.sampleEnd();
//log.info("Success..." + results.getTime() + " "+ results.getStartTime()+ " "+results.getEndTime());
//long endtime = new Date().getTime();
return results;
}
/**
* 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行,
* 类似于LoadRunner中的end方法.
*/
public void teardownTest(JavaSamplerContext arg0) {
results.cleanAfterSample();
//results.setStartNextThreadLoop(true);
}
}