一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client。
感觉这有点类似于HBase的Scan,通常是Client端获取每一条记录都是一次RPC调用服务端。
在Redis中,有没有类似HBase Scanner Caching的东西呢,一次请求,返回多条记录呢?
有,这就是Pipline。官方介绍 http://redis.io/topics/pipelining
通过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<String,String> data = new HashMap<String,String>(); 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<String> keys = redis.keys("*"); //直接使用Jedis hgetall start = System.currentTimeMillis(); Map<String,Map<String,String>> result = new HashMap<String,Map<String,String>>(); 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<String,Response<Map<String,String>>> responses = new HashMap<String,Response<Map<String,String>>>(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(); } }
测试结果如下:
使用pipeline来批量读写10000条记录,就是小菜一碟,秒完。
相关推荐
本篇文章主要介绍了Java使用Pipeline对Redis批量读写(hmset&hgetall),具有一定的参考价值,有兴趣的可以了解一下。
测试Jedis在10万次读写级别情况下的读写效率。...3)Pipeline方式读写,此种方式效率最高,但是由于将多条命令缓存与Outpustream并在syn()方法时一次性flush(),若本次出现异常,会影响全部命令执行。
今天小编就为大家分享一篇python使用pipeline批量读写redis的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
java客户端不是很好支持redis cluster,spring-date-redis和jedis批量提交还不支持,单个提交都是可以的。 为了批量解决批量提交 网上有几个方案,本示例使用了其中一种,demo里的JedisClusterPipeline类是网上找的...
本篇文章主要介绍了如何高效地向Redis插入大量的数据,现在分享给大家,感兴趣的小伙伴们可以参考一下。
Redis-PipeLine批量导入.docx
主要介绍了在Redis集群中使用pipeline批量插入的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本文主要介绍的是关于Redis性能提升之Batch批量读写的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 提示:本文针对的是StackExchange.Redis 一、问题呈现 前段时间在开发的时候,遇到了redis批量读的...
主要介绍了详解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
redis pipleLine
简单介绍 redis pipeline 的机制,结合一段实例说明pipeline 在提升吞吐量方面发生的效用。 案例背景 应用系统在数据推送或事件处理过程中,往往出现数据流经过多个网元; 然而在某些服务中,数据操作对redis 是强...
同时Redis还具有其它一些特性,其中包括简单的事物支持、发布订阅 ( pub/sub)、管道(pipeline)等 。 Redis具有丰富的客户端,支持现阶段流行的大多数编程语言。php常用的是phpredis, JAVA常用的是Jedis( ...
主要给大家介绍了关于Redis利用Pipeline加速查询速度的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
RedisPipe - 具有隐式流水线操作的Go开发的高吞吐量Redis客户端
干货:Jenkins Pipeline调用shell、python、java、groovy脚本的正确使用姿势.doc
kettle如何3秒内写入100万条数据到Redis https://blog.csdn.net/huryer/article/details/106889792
同意-Redis-Wrappers 这些是Appgree使用的类,用于封装和改进Jedis客户端,从而增加了流水线功能,主从控制和本地内存缓存,从而减少了不同线程重复读取的需求。 这些类可以单独使用或嵌套使用。执照该软件受Apache ...