我想用jmeter加载redis。我已经有了一个带有groovy脚本的JSR223Sampler
import redis.clients.jedis.Jedis;
import java.util.concurrent.ThreadLocalRandom;
String varuser = "user:" + ThreadLocalRandom.current().nextInt(1, 500);
Jedis jedis = new Jedis(IP, port);
String result = jedis.hgetAll(varuser);
SampleResult.setResponseData(result.toString().getBytes());
在一个拥有10个'用户'的ThreadGroup下。工作良好。现在我想把'用户'的数量提高到1000.连接数量会对性能产生负面影响,对吧?所以我想获得连接池的优势。根据
https://github.com/xetorthio/jedis/wiki/Getting-started
JedisPool就是答案。我的问题是我的jmeter测试计划必须如何?我在哪里放置将在其中创建JedisPool的jmeter-element(哪一个?)?不在我的ThreadGroup下,对吗?我如何在上面的sampler-script中使用池中的连接?
编辑
因此,在Dmitris的建议下,我创建了两个不同的测试计划。两者都不起作用。也许有人看到我的错误?
第一个计划:
测试计划
| --- setUp Thread Group
---- | --- JSR223采样器(1)
| ---线程组
---- | --- JSR223采样器(2)
| ---查看结果树
使用JSR223采样器(1)
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
JedisPool pool = new JedisPool(new JedisPoolConfig(), IP);
prop.put('pool', pool);
和JSR223采样器(2)
import redis.clients.jedis.Jedis;
import java.util.concurrent.ThreadLocalRandom;
String varuser = "user:" + ThreadLocalRandom.current().nextInt(1, 500);
Jedis jedis = props.get('pool');
String result = jedis.hgetAll(varuser);
SampleResult. ...
jedis.close();
我的第二个TestPlan看起来像
测试计划
| ---线程组
---- | ---测试行动
-------- | --- JSR223 PreProcessor
---- | --- JSR223采样器
---- | ---查看结果树
使用PreProcessor,如上面的JSR223采样器(1)和JSR223采样器,如上面的JSR223采样器(2)。
第一个计划附带响应消息
cannot cast object 'redis.clients.jedis.JedisPool@642715fb' with class
'redis.clients.jedis.JedisPool' to class 'redis.clients.jedis.Jedis'
第二个计划作出回应
no such property: pool for class: Script41082
我做错了什么?
我建议使用setUp Thread Group(如果你想测量池创建时间)或JSR223 Sampler采样器和Test Action组合(如果你不想在你的测试结果中包含池创建请求)在JSR223 PreProcessor的某处创建JedisPool
完成后,您可以将此“池”放入JMeter属性中,如:
def pool = new JedisPool(new JedisPoolConfig(), 'localhost')
props.put('pool', pool)
def pool = props.get('pool')
有关在JMeter测试中使用Groovy脚本的更多信息,请参阅Apache Groovy - Why and How You Should Use It文章
你从属性获得JedisPool
并尝试将其投射到Jedis
,这是不可能的,你需要从Jedis
获得JedisPool.getResource()
:
import redis.clients.jedis.JedisPool;
....
JedisPool pool = props.get('pool');
Jedis jedis = pool.getResource();