开始实验这个,是因为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文件了。

Java实现Redis pipeline比较的更多相关文章

  1. redis pipeline

    redis pipeline 简而言之就是把多个redis命令打包,一起发送给redis server,并且一起返回结果,减少客户端和服务器之间的多次“折返跑”

  2. java操作redis之jedis篇

    首先来简单介绍一下jedis,其实一句话就可以概括的,就是java操作redis的一种api.我们知道redis提供了基本上所有常用编程语言的clients,大家可以到http://redis.io/ ...

  3. Java连接redis的使用演示样例

    Java连接redis的使用演示样例 Redis是开源的key-value存储工具,redis通经常使用来存储结构化的数据,由于redis的key能够包括String.hash.listset和sor ...

  4. Java的redis 操作类-优化通用版本

    java操作redis多节点处理方式;http://blog.itpub.net/29254281/viewspace-1188644/首先maven引入依赖包 <dependency> ...

  5. redis学习心得之三-【java操作redis】

    今天主要是讲讲java对redis的操作,来段代码掩饰下基本操作即可明白. java调用你需要下载jedis.jar包 下载网址:https://github.com/xetorthio/jedis/ ...

  6. java 操作redis

    使用Java操作Redis需要jedis-2.1.0.jar,如果需要使用Redis连接池的话,还需commons-pool-1.5.4.jar package com.test; import ja ...

  7. java操作redis redis连接池

    redis作为缓存型数据库,越来越受到大家的欢迎,这里简单介绍一下java如何操作redis. 1.java连接redis java通过需要jedis的jar包获取Jedis连接. jedis-2.8 ...

  8. java 操作 redis

    1.Java 使用 Redis 只需要下载一个jar包即可 地址:http://maven.outofmemory.cn/redis.clients/jedis/2.5.2/ 工程

  9. java 使用redis 数据库

    [TOC] java 使用redis 数据库 连接redis package com.wsc.redis.Test1; import java.util.List; import java.util. ...

随机推荐

  1. 常用SQL时间格式SQLServer中文版的默认的日期字段datetime格式是yyyy-mm-d

    常用SQL时间格式 SQL Server中文版的默认的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm 例如: select getdate() -- ::08.177 ...

  2. python 编码处理

    # -*- coding: utf-8 -*-import easygui as gimport sysreload(sys)sys.setdefaultencoding('utf-8')

  3. oracle 自己改了 spfile 导致起不来

    oracle pfile 出错 今天在升级 oracle 内存的时候参数调错了,导致 oracle 起不来, 情急之下用 vim 修改了 spfile 文件,结果由于该文件是二进制的,不能直接修改,所 ...

  4. C/C++宏的用法

    今天看caffe源码的时候看到了很多宏定义的内容,苦于代码基础薄弱,无法全部理解,故在网上搜得此篇好文,转载一发附原文地址:http://blog.csdn.net/hanchaoman/articl ...

  5. Codeforces 1131 A. Sea Battle-暴力 (Codeforces Round #541 (Div. 2))

    A. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  6. 《深入浅出Nodejs》笔记——模块机制(1)

    前言 这是我读<深入浅出Nodejs>的笔记,真是希望我的机械键盘快点到啊,累死我了. CommonJS规范 主要分为模块引用.模块定义.模块标识三个部分. 模块引用 上下文提供requi ...

  7. CSS排版常用值指南

    高对比度是确保网页阅读无障碍的关键,但也往往会被过分强调. 白底黑子会让打断文本显得过分密集,反而影响可读性. 文字颜色 3b4348 链接颜色 235ea7 衬线字体 font-family: &q ...

  8. 发现一个FreeSWITCH bug

    在研究FreeSWITCH视频会议的混屏问题时候发现一个bug. 已提交jira. 附上代码,问题很明显,不解释 =========================================== ...

  9. 多协议注入工具t50

    多协议注入工具t50   t50是Kali Linux自带的一款网络数据包注入工具.该工具支持15种协议,不仅涵盖常规协议(ICMP.TCP.UDP),还涵盖基础协议和路由协议(GRE.IPSec.R ...

  10. 【BZOJ 3262】 3262: 陌上花开 (CDQ分治)

    3262: 陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A ...