我想用jmeter加载redis。我已经有了一个带有groovy-script
的JSR223Samplerimport 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下。工作良好。现在我想提高用户的数量'大量连接会对性能产生负面影响,对吧?所以我想获得连接池的优势。根据
https://github.com/xetorthio/jedis/wiki/Getting-started
JedisPool就是答案。我的问题是我的jmeter测试计划必须如何?我在哪里放置将在其中创建JedisPool的jmeter-element(哪一个?)?不在我的ThreadGroup下,对吗?我如何在上面的sampler-script中使用池中的连接?
修改
因此,德米特里斯建议我创建两个不同的测试计划。两者都不起作用。也许有人看到我的错误?
第一个计划:
TestPlan中
| --- setUp Thread Group
---- | --- JSR223采样器(1)
| ---线程组
---- | --- JSR223采样器(2)
| ---查看结果树
使用JSR223 Sampler(1)
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
JedisPool pool = new JedisPool(new JedisPoolConfig(), IP);
prop.put('pool', pool);
和JSR223 Sampler(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看起来像
TestPlan中
| ---线程组
---- | ---测试行动
-------- | --- JSR223 PreProcessor
---- | --- JSR223采样器
---- | ---查看结果树
使用PreProcessor,如上面的JSR223 Sampler(1)和JSR223 Sampler,如上面的JSR223 Sampler(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
我做错了什么?
答案 0 :(得分:1)
我建议使用setUp Thread Group(如果你想测量游泳池创建时间)或JSR223 Sampler采样器和Test Action组合在JSR223 PreProcessor的某处创建JedisPool(如果你不喜欢的话)我想在您的测试结果中包含池创建请求
完成后,您可以将此“池”放入JMeter Properties中,如:
在setUp线程组
中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文章
答案 1 :(得分:0)
您从属性中获取JedisPool
并尝试将其投放到Jedis
这是不可能的,您需要从Jedis
获取JedisPool.getResource()
:
import redis.clients.jedis.JedisPool;
....
JedisPool pool = props.get('pool');
Jedis jedis = pool.getResource();