开始实验这个,是因为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. grid+report 怎么在项目中使用

    grid+report 的例子很丰富,首先看你所用对应编程语言的例子.参考帮助的“产品介绍->快速入门指导”部分.根据快速入门指导中的说明,先把例子程序运行. 例子分两部分:1.报表模板例子,主 ...

  2. 利用WINDOWS活动目录提供LDAP的方案

    Windows Server 2008 R2 活动目录服务安装 http://blog.sina.com.cn/s/blog_622de9390100kgv3.html WINDOWS 2008 域控 ...

  3. LR运行场景时出现的error

    LR运行场景时出现的error 1.Action.c(24): Error -27740: Overlapped transmission of request to "home.asiai ...

  4. C++中正确使用PRId64

    http://blog.csdn.net/win_lin/article/details/7912693

  5. STL模板整理 list

    介绍: list容器是一种序列式容器,它是STL实现的双向链表,与vector相比它可以实现快速的插入和删除,但是不能够快速的随机访问. 头文件: #include <list> 构造函数 ...

  6. Python:使用正则去除HTML标签(转)

    利用正则式处理,不知道会不会有性能问题,没有经过太多测试. 目前我有很多还是使用BeautifulSoup进行这种处理. HTML实体处理的只是用于处理一些常用的实体. # -*- coding: u ...

  7. onethink 重写URL后,apache提示No input file specified

    <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{RE ...

  8. LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)

    #6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1   题目描述 给出 ...

  9. 携带结果的任务 Callable 与 Future

    Executor框架使用Runnable作为其基本任务表示形式.Runnable是一种有很大局限的抽象,它不能返回一个值或者抛出一个受检查的异常. 但是许多任务实际上都是存在延迟的计算,比如执行数据库 ...

  10. 深度学习应用系列(三)| autokeras使用入门

    我们在构建自己的神经网络模型时,往往会基于预编译模型上进行迁移学习.但不同的训练数据.不同的场景下,各个模型表现不一,需要投入大量的精力进行调参,耗费相当多的时间才能得到自己满意的模型. 而谷歌近期推 ...