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文件了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值