开始实验这个,是因为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的密码验证:

  1. package com.myapp.redisdemo;
  2.  
  3. import redis.clients.jedis.Jedis;
  4. import redis.clients.jedis.Pipeline;
  5. import redis.clients.jedis.Response;
  6.  
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. import java.util.Set;
  10.  
  11. /**
  12. * Created by baidu on 16/10/16.
  13. */
  14. public class RedisDemo {
  15.  
  16. public static void main(String[] args) {
  17. String redisIP = "10.117.146.16";
  18. int redisPort = 6379;
  19. Jedis jedis;
  20. try {
  21. jedis = new Jedis(redisIP, redisPort);
  22. jedis.auth("[用户名]");
  23. jedis.select(8);
  24. }
  25. catch (Exception e) {
  26. e.printStackTrace();
  27. System.out.printf("初始化Redis连接错误:%s, %d", redisIP, redisPort);
  28. return;
  29. }
  30.  
  31. jedis.flushDB();
  32. long start = System.currentTimeMillis();
  33. notusePipeline(jedis);
  34. long end = System.currentTimeMillis();
  35. System.out.printf("不使用Pipeline的方式用时:%d毫秒", end-start);
  36.  
  37. jedis.flushDB();
  38. start = System.currentTimeMillis();
  39. usePipeline(jedis);
  40. end = System.currentTimeMillis();
  41. System.out.printf("使用Pipeline的方式用时:%d毫秒", end-start);
  42.  
  43. }
  44.  
  45. private static void notusePipeline(Jedis jedis) {
  46. Map<String, String> mp = new HashMap<String, String>();
  47. try {
  48. for (int i=0; i<10000; i++) {
  49. mp.clear();
  50. mp.put("k"+i, "v"+i);
  51. jedis.hmset("keys"+i, mp);
  52. }
  53. }
  54. catch (Exception e) {
  55. e.printStackTrace();
  56. }
  57. }
  58.  
  59. private static void usePipeline(Jedis jedis) {
  60. Map<String, String> mp = new HashMap<String, String>();
  61. try {
  62. Pipeline pl = jedis.pipelined();
  63. for (int i=0; i<10000; i++) {
  64. mp.clear();
  65. mp.put("k"+i, "v"+i);
  66. pl.hmset("keys"+i, mp);
  67. }
  68. pl.sync();
  69. }
  70. catch (Exception e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. }

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

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

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

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

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

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

  1. 开始运行不使用Pipeline的方式
  2. 不使用Pipeline的方式用时:72464毫秒
  3. 开始运行使用Pipeline的方式
  4. 使用Pipeline的方式用时:173毫秒
  5.  
  6. Process finished with exit code 0

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

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

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

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

  1. 10000条:
  2. 开始运行使用Pipeline的方式
  3. 使用Pipeline的方式用时:769毫秒
  4.  
  5. 50000条:
  6. 开始运行使用Pipeline的方式
  7. 使用Pipeline的方式用时:1275毫秒
  8.  
  9. 100000条:
  10. 开始运行使用Pipeline的方式
  11. 使用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. finally

     finally 我们都知道无论try语句中是否抛出异常,finally中的语句一定会被执行.我们来看下面的例子: try: f = open("/tmp/output", &qu ...

  2. LeetCode解题报告—— Regular Expression Matching

    Given an input string (s) and a pattern (p), implement regular expression matching with support for  ...

  3. python在windows下连接mysql数据库

    一,安装MySQL-python python 连接mysql数据库需要 Python interface to Mysql包,包名为 MySQL-python ,PyPI上现在到了1.2.5版本.M ...

  4. spring mvc 表单提交 乱码

    1.在web.xml添加过滤器: <filter> <filter-name>SpringCharacterEncoding</filter-name> <f ...

  5. Markdown 表情包

  6. 为函数自定义bind方法实例页面

    HTML代码: <input id="button" type="button" value="点击我" /> <span ...

  7. HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. 复选框的全选+全不选+ajax传递复选框的value值+后台接受复选框默认值

    1.html代码 <!--全选框/全不选--> <input type="checkbox" name="all" id="all& ...

  9. STM32通用定时器实现LED灯闪烁

    刚才看了一下STM32通用定时器的教程,其实和51的定时器使用差不多.只是因为32的时钟更复杂,可操控的寄存器更多,所以写的时候可能更复杂. 使用通用定时器中断的一般步骤:1.使能定时器时钟 这个需要 ...

  10. 51使用while进行延时的问题

    上周写了一个简单的IO口翻转的程序,但是很奇怪,在FPGA板子上怎么也跑不起来. 后面发现问题可能出在延时函数上. void Delay(unsigned char t) { while(--t); ...