说pipeline以前首先明确两点java
redis的1次网络命令的耗时为 :1次网络时间 + 1次命令执行时间redis
redis的n次网络命令的耗时为: n次网络时间 + n次命令执行时间网络
有了上面的计算,咱们知道,若是咱们要对redis进行一个批量的操做,是很耗时的,但咱们又知道,redis的命令执行时间一般来讲是很是快的,最关键的耗时实际上是在网络传输的时间上。pipeline就是用来将n次的网络时间优化为一次的网络时间。优化
pipeline是将n个命令一次性打包,发送到服务端逐个执行,耗时为:1次网络时间 + n次命令时间spa
由此看来,pipeline能够大大减少咱们网络时间的开销,可是在使用时,仍然须要注意一个点,即 pipeline每次的条数须要控制(网络环境相对复杂)code
下面来看一个插入10000条hash对比ip
没有使用pipline 耗时 50sget
Jedis jedis = new Jedis("127.0.0.1",6379); for( int i=0; i<10000; i++){ jedis.hset("hashkey:"+i,"field"+i,"value"+i); }
使用pipline 耗时 0.7shash
Jedis jedis = new Jedis("127.0.0.1",6379); for(int i=0; i<100; i++){ Pipeline pipeline = jedis.pipelined(); for(int j=i*100; j<(i+1)*100; j++){ pipeline.hset("hashkey:"+j,"field"+j,"value"+j); } pipeline.syncAndReturnAll(); }
咱们知道redis原生有相似 mget mset的批量操做命令,这些命令都是原子的,即会阻塞其余的命令,知道命令完成返回。而pipeline的每一条命令是拆分过的(非原子),假设打包1000个命令的pipeline传到服务端,则服务端会把pipeline的每一个命令当成原子。但不管是pipeline仍是M操做 返回的结果都是同样的。pip
1.注意没次pipeline携带的数据量(网络传输效率)
2.pipeline每次只能做用在一个redis节点上