通常,在Redis客户端请求后,通常会阻止并等待Redis服务器端的处理,然后在Redis服务器端处理完毕并请求命令后,通过响应消息将结果返回给客户端。 这类似于HBase的扫描。 通常,客户端获取每个记录是由RPC调用服务器端。 Redis中有类似HBase Scanner Caching的东西吗? 是否一次返回多条记录? 是的,这就是Pipline。 官方会介绍http://redis.io/topics/pipe lining。
在pipeline方式下进行大量操作时,可以节省大量浪费在网络延迟上的时间。 需要注意的是,我们以pipeline方式打包并发送命令。 redis必须先缓存所有命令的处理结果,然后才能处理所有命令。 打包的命令越多,缓存就占用的内存越多。 所以打包的命令并不是越多越好。
使用Pipeline,在Redis上大量读写时,性能得到了极大的提高。
我用Java做了测试:
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; 公共类别测试(publicstaticvoidmain (string [ ] args ) throwsexception ) Jedisredis=newJedis(127.0.0.1 ),63777 redis.select(8); redis.flushDB (; //hmsetlongstart=system.current time millis (; //直接与hmsetfor(intI=0; i 10000; I({data.clear ); DATA.put('k_'I,' v_' i ); redis.hmset(key_I,data ); } longend=system.current time millis (; system.out.println (' dbsize : [ ' redis.dbsize () ] . ); system.out.println (hmsetwithoutpipelineused (() ) (end-start ) ) ) ) seconds . ); redis.select(8); redis.flushDB (; //pipelinehmsetpipelinep=redis.pipelined (; start=System.currentTimeMillis (; for(intI=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 (hmsetwithpipelineused () () ) (end-start ) ) ) ) seconds . ); //hmgetsetkeys=redis.keys('* '; //jedishgetallstart=system.current time millis (; MapString,MapString,String result=new HashMapString,MapString,String (; 字符串密钥:密钥(for ) result.put (key,redis.Hgetall )密钥); } end=System.currentTimeMillis (; system.out.println (' resultsize : (' result.size ) () () ); system.out.println (hgetallwithoutpipelineused (() ) (end-start ) ) ) ) seconds . ); pipeline hgetall MapString,ResponseMapString,string responses=newhashmapstring,ResponseMapString,string(result.clear ) start=System.currentTimeMillis (; for(stringkey:keys ) responses.put (key,p.Hgetall ) key ); (} p.sync ); stringk : responses.keyset () result.put,responses.get(k ) k ).get ); } end=System.currentTimeMillis (; system.out.println (' resultsize : (' result.size ) () () ); system.out.println (hgetallwithpipelineused () ) (end-start )/1000 ) ) ) seconds . ); redis.disconnect (; }
//测试结果:
用pipeline统一读写10000条记录,小菜一碟,秒钟就结束。
dbsize:[10000] .
hmsetwithoutpipelineused [ 243 ] seconds .
dbsize:[10000] .
hmsetwithpipelineused [0] seconds .
result size:[10000] .
hgetallwithoutpipelineused [ 243 ] seconds .
result size:[10000] .
hgetallwithpipelineused [0] seconds .
//测试结果2 (外联网) )。
dbsize:[10000] .
hmsetwithoutpipelineused [ 653 ] seconds .
dbsize:[10000] .
hmsetwithpipelineused [1] seconds .
result size:[10000] .
hgetallwithoutpipelineused [ 680 ] seconds .
result size:[10000] .
hgetallwithpipelineused [1] seconds .
转载于:https://www.cn blogs.com/panchanggui/p/9848563.html