我们可以利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。
通过pipeline方式当有大批量的操作时候。我们可以节省很多原来浪费在网络延迟的时间。需要注意到是用 pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并是不是打包的命令越多越好。具体代码如下:
package com.jd.redis.client;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
publicclass PipelineTest {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
int count = 1000;
long start = System.currentTimeMillis();
withoutPipeline(count);
long end = System.currentTimeMillis();
System.out.println("withoutPipeline: " + (end-start));
start = System.currentTimeMillis();
usePipeline(count);
end = System.currentTimeMillis();
System.out.println("usePipeline: " + (end-start));
}
privatestaticvoid withoutPipeline(int count){
Jedis jr = null;
try {
jr = new Jedis("10.10.224.44", 6379);
for(int i =0; i<count; i++){
jr.incr("testKey1");
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
if(jr!=null){
jr.disconnect();
}
}
}
privatestaticvoid usePipeline(int count){
Jedis jr = null;
try {
jr = new Jedis("10.10.224.44", 6379);
Pipeline pl = jr.pipelined();
for(int i =0; i<count; i++){
pl.incr("testKey2");
}
pl.sync();
} catch (Exception e) {
e.printStackTrace();
}
finally{
if(jr!=null){
jr.disconnect();
}
}
}
}