redisメッセージキューのパフォーマンステスト
42765 ワード
redisメッセージキュー
redisブロックリスト
テスト環境 ubuntu マシンデュアルコア4 Gメモリ普通機 外部ネットワークトラフィック4 M redisバージョン:3.2.6 redisおよびテストサービスプログラムは、1台のサーバ上で bind:127.0.0.1, に注記 maxmemory 3gb 生産消費文字列サイズ:672 byte テストの考え方固定数量生産スレッドを開いて書き込み操作 を行う.固定数の消費スレッドを開き、消費ブロック操作 を行う.は、固定メッセージの生産者のスループットと消費者のスループットをそれぞれ統計する である.
パフォーマンステスト
結果分析生産者の性能は消費者 よりやや高い.生産者と消費者の両方のスループットは2.5 W以上 である.高構成のコンピュータredisのパフォーマンスは より向上します.小型システムメッセージシステム に適合
部分コード
消費者
生産者
redisブロックリスト
lpush key value1 value2 ..
brpop key 0
テスト環境
パフォーマンステスト
---------write end ------
--------- -------------- ------------- ----- ---------- ----- ---
-2016-12-16 17:35:42---2016-12-16 17:36:20------1000000------38------26315------4
[framework] 2016-12-16 17:36:22,863 - com.jiazq.jizq.redis.mq.RedisMqConsumerSchudler -40656 [redisMq-consumer-i] ERROR com.jiazq.jizq.redis.mq.RedisMqConsumerSchudler -
--------- -------------- ----- ------- ------ ------ -----
-2016-12-16 17:35:42---2016-12-16 17:36:22------1000001------40------25000------4
--------- -------------- ------------- ----- ---------- ----- ---
-2016-12-16 17:39:09---2016-12-16 17:40:25------2000000------75------26666------4
[framework] 2016-12-16 17:40:29,547 - com.jiazq.jizq.redis.mq.RedisMqConsumerSchudler -79935 [redisMq-consumer-i] ERROR com.jiazq.jizq.redis.mq.RedisMqConsumerSchudler -
--------- -------------- ----- ------- ------ ------ -----
-2016-12-16 17:39:09---2016-12-16 17:40:29------2000001------79------25316------4
---------write end ------
--------- -------------- ------------- ----- ---------- ----- ---
-2016-12-16 17:43:08---2016-12-16 17:45:03------3000000------114------26315------4
[framework] 2016-12-16 17:45:11,143 - com.jiazq.jizq.redis.mq.RedisMqConsumerSchudler -122312 [redisMq-consumer-i] ERROR com.jiazq.jizq.redis.mq.RedisMqConsumerSchudler -
--------- -------------- ----- ------- ------ ------ -----
-2016-12-16 17:43:08---2016-12-16 17:45:11------3000001------122------24590------4
結果分析
部分コード
消費者
package com.jiazq.jizq.redis.mq;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.log4j.Logger;
import redis.clients.jedis.Jedis;
public class RedisMqConsumerSchudler {
private static Logger logger = Logger.getLogger(RedisMqConsumerSchudler.class);
int threadNumber;
//
long startTime = 0;
volatile boolean runState = true;
AtomicLong count = new AtomicLong(0);
//
Thread[] workers = null;
public RedisMqConsumerSchudler (int threadNumber) {
this.threadNumber = threadNumber;
workers = new Thread[threadNumber];
for (int i = 0; i < threadNumber; i++) {
workers[i] = new Thread(new ReadisConsumeTask(JedisManager.instance().getJedis()));
workers[i].setDaemon(true);
workers[i].setName("redisMq-consumer-" + "i");
}
}
/**
*
*/
public void start() {
for (int i = 0; i < threadNumber; i++) {
workers[i].start();
}
startTime = System.currentTimeMillis();
}
class ReadisConsumeTask implements Runnable {
private Jedis jedis = null;
ReadisConsumeTask(Jedis jedis) {
this.jedis = jedis;
}
@Override
public void run() {
while (runState) {
try {
List strs = jedis.brpop(0,ConfigManager.redis_queue);
if (null != strs && strs.size() == 2) {
count.addAndGet(1);
}
if (count.get() == ConfigManager.redis_write_count) {
StringBuilder sb = new StringBuilder();
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
long useTime = (new Date().getTime()- startTime)/1000;
long throughput = count.get() / useTime;
sb.append("
--------- -------------- ----- ------- ------ ------ -----
");
sb.append("-");
sb.append(format.format(new Date(startTime)));
sb.append("---");
sb.append(format.format(new Date()));
sb.append("------");
sb.append(count.get());
sb.append("------");
sb.append(useTime);
sb.append("------");
sb.append(throughput);
sb.append("------");
sb.append(threadNumber);
logger.error(sb.toString());
runState = false;
}
} catch (Throwable t) {
logger.error("",t);
//
if (!jedis.isConnected()) {
//
jedis.close();
//
jedis = JedisManager.instance().getJedis();
}
}
}
}
}
}
生産者
package com.jiazq.jizq.redis.mq;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.log4j.Logger;
import redis.clients.jedis.Jedis;
public class RedisMqProduerSchudler {
private static Logger logger = Logger.getLogger(RedisMqConsumerSchudler.class);
int threadNumber;
//
AtomicLong writeCount = new AtomicLong(ConfigManager.redis_write_count);
//
long startTime = 0;
volatile boolean runState = true;
//
Thread[] workers = null;
RedisMqProduerSchudler (int threadNumber) {
this.threadNumber = threadNumber;
workers = new Thread[threadNumber];
for (int i = 0; i < threadNumber; i++) {
workers[i] = new Thread(new RedisProducerTask(JedisManager.instance().getJedis()));
workers[i].setDaemon(true);
workers[i].setName("redisMq-consumer-" + "i");
}
}
/**
*
* @throws InterruptedException
*/
public void start() throws InterruptedException {
for (int i = 0; i < threadNumber; i++) {
workers[i].start();
}
startTime = System.currentTimeMillis();
}
private static void loopWait(Jedis jedis, long count) throws InterruptedException {
if (count > ConfigManager.redis_write_count) {
Thread.sleep(200);
loopWait(jedis, jedis.llen(ConfigManager.redis_queue));
}
}
class RedisProducerTask implements Runnable {
private Jedis jedis;
public RedisProducerTask (Jedis jedis) {
this.jedis = jedis;
}
@Override
public void run() {
while (runState) {
try {
long number = writeCount.decrementAndGet();
if (runState & number == 0) {
runState = false;
StringBuilder sb = new StringBuilder();
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
long useTime = ((new Date().getTime() - startTime)/1000);
long throughput =( ConfigManager.redis_write_count/useTime);
sb.append("
---------write end ------
");
sb.append("--------- -------------- ------------- ----- ---------- ----- ---
");
sb.append("-");
sb.append(format.format(new Date(startTime)));
sb.append("---");
sb.append(format.format(new Date()));
sb.append("------");
sb.append(ConfigManager.redis_write_count);
sb.append("------");
sb.append(useTime);
sb.append("------");
sb.append(throughput);
sb.append("------");
sb.append(threadNumber);
logger.error(sb.toString());
break;
} else {
long count = jedis.lpush(ConfigManager.redis_queue,
ConfigManager.test_string_value);
//loopWait(jedis, count);
}
} catch (Throwable t) {
logger.error("",t);
//
if (!jedis.isConnected()) {
//
jedis.close();
//
jedis = JedisManager.instance().getJedis();
}
}
}
}
}
}