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文件了。
Java实现Redis pipeline比较的更多相关文章
- redis pipeline
redis pipeline 简而言之就是把多个redis命令打包,一起发送给redis server,并且一起返回结果,减少客户端和服务器之间的多次“折返跑”
- java操作redis之jedis篇
首先来简单介绍一下jedis,其实一句话就可以概括的,就是java操作redis的一种api.我们知道redis提供了基本上所有常用编程语言的clients,大家可以到http://redis.io/ ...
- Java连接redis的使用演示样例
Java连接redis的使用演示样例 Redis是开源的key-value存储工具,redis通经常使用来存储结构化的数据,由于redis的key能够包括String.hash.listset和sor ...
- Java的redis 操作类-优化通用版本
java操作redis多节点处理方式;http://blog.itpub.net/29254281/viewspace-1188644/首先maven引入依赖包 <dependency> ...
- redis学习心得之三-【java操作redis】
今天主要是讲讲java对redis的操作,来段代码掩饰下基本操作即可明白. java调用你需要下载jedis.jar包 下载网址:https://github.com/xetorthio/jedis/ ...
- java 操作redis
使用Java操作Redis需要jedis-2.1.0.jar,如果需要使用Redis连接池的话,还需commons-pool-1.5.4.jar package com.test; import ja ...
- java操作redis redis连接池
redis作为缓存型数据库,越来越受到大家的欢迎,这里简单介绍一下java如何操作redis. 1.java连接redis java通过需要jedis的jar包获取Jedis连接. jedis-2.8 ...
- java 操作 redis
1.Java 使用 Redis 只需要下载一个jar包即可 地址:http://maven.outofmemory.cn/redis.clients/jedis/2.5.2/ 工程
- java 使用redis 数据库
[TOC] java 使用redis 数据库 连接redis package com.wsc.redis.Test1; import java.util.List; import java.util. ...
随机推荐
- finally
finally 我们都知道无论try语句中是否抛出异常,finally中的语句一定会被执行.我们来看下面的例子: try: f = open("/tmp/output", &qu ...
- LeetCode解题报告—— Regular Expression Matching
Given an input string (s) and a pattern (p), implement regular expression matching with support for ...
- python在windows下连接mysql数据库
一,安装MySQL-python python 连接mysql数据库需要 Python interface to Mysql包,包名为 MySQL-python ,PyPI上现在到了1.2.5版本.M ...
- spring mvc 表单提交 乱码
1.在web.xml添加过滤器: <filter> <filter-name>SpringCharacterEncoding</filter-name> <f ...
- Markdown 表情包
- 为函数自定义bind方法实例页面
HTML代码: <input id="button" type="button" value="点击我" /> <span ...
- HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 复选框的全选+全不选+ajax传递复选框的value值+后台接受复选框默认值
1.html代码 <!--全选框/全不选--> <input type="checkbox" name="all" id="all& ...
- STM32通用定时器实现LED灯闪烁
刚才看了一下STM32通用定时器的教程,其实和51的定时器使用差不多.只是因为32的时钟更复杂,可操控的寄存器更多,所以写的时候可能更复杂. 使用通用定时器中断的一般步骤:1.使能定时器时钟 这个需要 ...
- 51使用while进行延时的问题
上周写了一个简单的IO口翻转的程序,但是很奇怪,在FPGA板子上怎么也跑不起来. 后面发现问题可能出在延时函数上. void Delay(unsigned char t) { while(--t); ...