如何在Jmeter中使用JedisPool

时间:2017-12-20 10:28:25

标签: groovy redis jmeter jedis

我想用jmeter加载redis。我已经有了一个带有groovy-script

的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下。工作良好。现在我想提高用户的数量'大量连接会对性能产生负面影响,对吧?所以我想获得连接池的优势。根据

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

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我建议使用setUp Thread Group(如果你想测量游泳池创建时间)或JSR223 Sampler采样器和Test Action组合在JSR223 PreProcessor的某处创建JedisPool(如果你不喜欢的话)我想在您的测试结果中包含池创建请求

完成后,您可以将此“池”放入JMeter Properties中,如:

  1. 在setUp线程组

    def pool = new JedisPool(new JedisPoolConfig(), 'localhost')
    props.put('pool', pool)
    
  2. 在考试过程中的某个地方

    def pool = props.get('pool')
    
  3. 有关在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();