redisメッセージキューのパフォーマンステスト

42765 ワード

redisメッセージキュー
redisブロックリスト
lpush key value1 value2 ..
brpop key 0

テスト環境
  • ubuntu
  • マシンデュアルコア4 Gメモリ普通機
  • 外部ネットワークトラフィック4 M
  • redisバージョン:3.2.6
  • redisおよびテストサービスプログラムは、1台のサーバ上で
  • bind:127.0.0.1,
  • に注記
  • maxmemory 3gb
  • 生産消費文字列サイズ:672 byte
  • テストの考え方
  • 固定数量生産スレッドを開いて書き込み操作
  • を行う.
  • 固定数の消費スレッドを開き、消費ブロック操作
  • を行う.
  • は、固定メッセージの生産者のスループットと消費者のスループットをそれぞれ統計する
  • である.
    パフォーマンステスト
    ---------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
    
    

    結果分析
  • 生産者の性能は消費者
  • よりやや高い.
  • 生産者と消費者の両方のスループットは2.5 W以上
  • である.
  • 高構成のコンピュータredisのパフォーマンスは
  • より向上します.
  • 小型システムメッセージシステム
  • に適合
    部分コード
    消費者
    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(); } } } } } }