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);

}

}