一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client。

感觉这有点类似于HBase的Scan,通常是Client端获取每一条记录都是一次RPC调用服务端。

在Redis中,有没有类似HBase Scanner Caching的东西呢,一次请求,返回多条记录呢?

通过pipeline方式当有大批量的操作时候,我们可以节省很多原来浪费在网络延迟的时间,需要注意到是用pipeline方式打包命令发 送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并不是打包的命令越多越好。

使用Pipeline在对Redis批量读写的时候,性能上有非常大的提升。

Java测试了一下:

package com.lxw1234.redis;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.Pipeline;

import redis.clients.jedis.Response;

public class Test {

public static void main(String[] args) throws Exception {

Jedis redis = new Jedis("127.0.0.1", 6379, 400000);

Map data = new HashMap();

redis.select(8);

redis.flushDB();

//hmset

long start = System.currentTimeMillis();

//直接hmset

for (int i=0;i<10000;i++) {

data.clear();

data.put("k_" + i, "v_" + i);

redis.hmset("key_" + i, data);

}

long end = System.currentTimeMillis();

System.out.println("dbsize:[" + redis.dbSize() + "] .. ");

System.out.println("hmset without pipeline used [" + (end - start) / 1000 + "] seconds ..");

redis.select(8);

redis.flushDB();

//使用pipeline hmset

Pipeline p = redis.pipelined();

start = System.currentTimeMillis();

for (int i=0;i<10000;i++) {

data.clear();

data.put("k_" + i, "v_" + i);

p.hmset("key_" + i, data);

}

p.sync();

end = System.currentTimeMillis();

System.out.println("dbsize:[" + redis.dbSize() + "] .. ");

System.out.println("hmset with pipeline used [" + (end - start) / 1000 + "] seconds ..");

//hmget

Set keys = redis.keys("*");

//直接使用Jedis hgetall

start = System.currentTimeMillis();

Map> result = new HashMap>();

for(String key : keys) {

result.put(key, redis.hgetAll(key));

}

end = System.currentTimeMillis();

System.out.println("result size:[" + result.size() + "] ..");

System.out.println("hgetAll without pipeline used [" + (end - start) / 1000 + "] seconds ..");

//使用pipeline hgetall

Map>> responses = new HashMap>>(keys.size());

result.clear();

start = System.currentTimeMillis();

for(String key : keys) {

responses.put(key, p.hgetAll(key));

}

p.sync();

for(String k : responses.keySet()) {

result.put(k, responses.get(k).get());

}

end = System.currentTimeMillis();

System.out.println("result size:[" + result.size() + "] ..");

System.out.println("hgetAll with pipeline used [" + (end - start) / 1000 + "] seconds ..");

redis.disconnect();

}

}

测试结果如下:

dbsize:[10000] ..

hmset without pipeline used [243] seconds ..

dbsize:[10000] ..

hmset with pipeline used [0] seconds ..

result size:[10000] ..

hgetAll without pipeline used [243] seconds ..

result size:[10000] ..

hgetAll with pipeline used [0] seconds ..

使用pipeline来批量读写10000条记录,就是小菜一碟,秒完。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java hgetall_详解Java使用Pipeline对Redis批量读写(hmsethgetall)相关推荐

  1. 【java】详解Java的类文件(class文件)结构

    1.概述 转载:详解Java的类文件(class文件)结构 大家好,我是二哥呀,今天我拿了一把小刀,准备解剖一下 Java 的 class 文件. CS 的世界里流行着这么一句话,"计算机科 ...

  2. java deepcopy_详解JAVA 深层拷贝 DeepCopy的使用方式

    说到复制方法,在开发程序中要怎么复制呢?其实复制Java数组的方法很多,但大多数都是浅层复制,今天爱站技术频道小编带你寻找详解JAVA 深层拷贝 DeepCopy的使用方式. 方法实现很简单,提供两种 ...

  3. java命令详解 java -D

    2019独角兽企业重金招聘Python工程师标准>>> JAVA 命令参数详解: 1.-D<name>=<value> set a system proper ...

  4. java nio详解,Java NIO API详解

    Java NIO API详解 在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的阻塞(blocking)API.对于大多数应用来说,这样的API使用很方 便,然而,一些对 ...

  5. java jdbc_详解Java基础知识——JDBC

    JDBC Java DataBase Connectivity,java数据库连接,为了降低操作数据的难度,java提供jdbc,按照java面向对象特点,对操作进行了很多封装. JDBC提供了很多接 ...

  6. Java注释详解-Java文档注释生成Java API文档

    Java文档注释是一种功能强大的注释形式,如果在你所编写的程序中规范的添加文档注释,那你就可以生成一份系统正规的API文档.Java文档注释 /**文档注释内容*/,注意区分多行注释/*多行注释*/. ...

  7. 【java】详解java中的注解(Annotation)

    目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...

  8. java cache详解,Java内存缓存详解

    1.缓存为什么要存在 应用服务器资源是有限的,数据库每秒中接受请求的次数也是有限的.如果利用有限的资源来提供尽可能大的吞吐量呢,一个办法:减少计 算量,缩短请求流程(减少网络io或者硬盘io),这时候 ...

  9. byte java byte_详解java中的byte类型

    Java中整数类型有:byte占8位, short 占16位, int占32位, long占64位 Java也提供了一个byte数据类型,并且是基本类型中的整数类型.java byte是作为最小的数字 ...

最新文章

  1. java创建node类型数据类型_[Java教程]js DOM Node类型
  2. 继续给力,持续一个星期位列NO.1
  3. 计算机网络中的时延有哪几部分,计算机网络中的四种延迟分别是什么?
  4. 分布式技术追踪 2018年第二十期
  5. 《Sibelius 脚本程序设计》连载(四十二) - 4.12 Selection
  6. ChannelHandler 与 ChannelPipeline 详解
  7. linux下(ubuntu)反删除(误删恢复)与回收站制作
  8. python graphviz中文乱码_graphviz画图与中文乱码等问题总结
  9. python取出满足条件的行_numpy ndarray 取出满足特定条件的某些行实例
  10. android顶部居中,如何将drawableLeft对齐到顶部,而不是在android TextView中居中?
  11. ssl证书 所属项目怎么上传_Typora + 七牛云图床快速配置,告别手动上传图片!...
  12. ogg oracle 测试kafka_云MSP技本功|基于OGG 实现Oracle到Kafka增量数据实时同步
  13. SAE J1939 协议源代码分析(一)-程序结构框架
  14. ppt设置外观样式_PPT中设置视频外观样式的方法
  15. css写三角兼容ie6
  16. 公司代码与采购组织的分配关系
  17. PPPD chat中文帮助
  18. Unity 导航系统Navigation
  19. php怎么定义字符串变量的值,php字符串变量怎么替换
  20. 破解软件的原理是什么(软件被破解公开)

热门文章

  1. 莎士比亚文集词频统计并行化算法
  2. [分治] 51Nod1472 Codeforces #549F. Yura and Developers
  3. 阿里云SLB负载均衡
  4. 关于PR安装在D盘初始化时闪退,加载到optical的时候PR直接闪退
  5. linux充气服务器,XenLinux balloon的实现分析
  6. 需求分析挑战之旅(疯狂的订餐系统)(2)——需求分析的大道理
  7. Asp.Net常见问题及技术实现方案(一)
  8. facetime 来电提醒_FaceTime应该比这更好
  9. 2020-11-02
  10. Windows Server2012 安装升级补丁更新