一般情况下,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;
- publicclassTest{
- publicstaticvoid main(String[] args)throwsException{
- Jedis redis =newJedis("127.0.0.1",6379,400000);
- Map<String,String> data =newHashMap<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);
- }
- longend=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<String,Map<String,String>> result =newHashMap<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 =newHashMap<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();
- }
- }
测试结果如下:
- 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使用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 ...