• Java实现Redis pipeline比较


    开始实验这个,是因为Redis实战.pdf上面有例子。

    上面用的是 org.jredis包,可是发现这个包不在maven的公共仓库里。需要先下载然后放在本地,导入maven依赖。详见:

    http://blog.csdn.net/zhu_tianwei/article/details/44900955

    https://github.com/alphazero/jredis

    在Redis实战.pdf上也有例子。

    而Maven公共仓库提供的是jedis包。网上也有例子:

    http://www.tuicool.com/articles/aeuAfaN

    就用这个包来实验吧。

    代码如下,注意,加了auth的密码验证:

    package com.myapp.redisdemo;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.Pipeline;
    import redis.clients.jedis.Response;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    
    
    /**
     * Created by baidu on 16/10/16.
     */
    public class RedisDemo {
    
        public static void main(String[] args) {
            String redisIP = "10.117.146.16";
            int redisPort = 6379;
            Jedis jedis;
            try {
                jedis = new Jedis(redisIP, redisPort);
                jedis.auth("[用户名]");
                jedis.select(8);
            }
            catch (Exception e) {
                e.printStackTrace();
                System.out.printf("初始化Redis连接错误:%s, %d", redisIP, redisPort);
                return;
            }
    
            jedis.flushDB();
            long start = System.currentTimeMillis();
            notusePipeline(jedis);
            long end = System.currentTimeMillis();
            System.out.printf("不使用Pipeline的方式用时:%d毫秒", end-start);
    
            jedis.flushDB();
            start = System.currentTimeMillis();
            usePipeline(jedis);
            end = System.currentTimeMillis();
            System.out.printf("使用Pipeline的方式用时:%d毫秒", end-start);
    
        }
    
        private static void notusePipeline(Jedis jedis) {
            Map<String, String> mp = new HashMap<String, String>();
            try {
                for (int i=0; i<10000; i++) {
                    mp.clear();
                    mp.put("k"+i, "v"+i);
                    jedis.hmset("keys"+i, mp);
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private static void usePipeline(Jedis jedis) {
            Map<String, String> mp = new HashMap<String, String>();
            try {
                Pipeline pl = jedis.pipelined();
                for (int i=0; i<10000; i++) {
                    mp.clear();
                    mp.put("k"+i, "v"+i);
                    pl.hmset("keys"+i, mp);
                }
                pl.sync();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    运行(不用配置,直接命令行运行),报错:

    初始化Redis连接错误:10.117.146.16, 6379

    判断因为是需要把端口设置到8000以上。

    所以把Redis主库的端口改到了8379,从库的端口保持不变(注意改下从库里主从同步的端口)。

    另外,10000次操作实在太慢了,所以改到了1000次。(运行过程中,可以select 8,然后dbsize来看已经插入了多少条)。

    现在能够运行成功了,运行结果如下:

    开始运行不使用Pipeline的方式
    不使用Pipeline的方式用时:72464毫秒
    开始运行使用Pipeline的方式
    使用Pipeline的方式用时:173毫秒
    
    Process finished with exit code 0

    不用Pipeline的方式,跑了72秒多,平均每秒操作十多条数据。

    而采用Pipeline的方式,只运行了173毫秒,吞吐量提高非常多。

    这也说明了:大量的时间是在网络交互上,Redis本身处理能力是很强的。

    用更大量的数据来试一下Pipeline的时间。

    10000条:
    开始运行使用Pipeline的方式
    使用Pipeline的方式用时:769毫秒
    
    50000条:
    开始运行使用Pipeline的方式
    使用Pipeline的方式用时:1275毫秒
    
    100000条:
    开始运行使用Pipeline的方式
    使用Pipeline的方式用时:7297毫秒

    注意,量非常大的时候,以前用Python的经验是,Pipeline会出错。不知道Jedis本身会不会做优化。还是需要使用的时候,有所注意。

    在降低网络传输消耗,提高吞吐量,和保证每次操作成功性方面做一个好的平衡。

    现在db 8里面有100000条数据,可以flushdb来删除本db的数据,然后就可以用之前学到的命令 bgrewriteaof来压缩aof文件了。

  • 相关阅读:
    子程序定义-3
    子程序定义-2
    子程序定义-1
    MQ报 AMQ9259
    观nginx与lvs负载均衡的较量
    绑定变量值长度不一致,mismatch问题
    perl-printf 函数
    perl 运算符
    强制让SQL走谓词推入
    PGA概念
  • 原文地址:https://www.cnblogs.com/charlesblc/p/5965957.html
Copyright © 2020-2023  润新知