java客户端与redis服务器之间使用tcp协议进行通信,客户端向服务器每发送一条语句,就会阻塞等待结果,如果有多条命令,那么这个发送语句和等待结果的时间就比较长了。管道的作用就是将这多条语句打包一起发送给服务器,这样,无论有多少条语句,都只需要一次发送,一次等待的时间就可以了。先看代码。
Jedis jedis = new Jedis("192.168.229.128", 6379);
// 开启管道
Pipeline pipelined = jedis.pipelined();
for(int i = 0; i < 100000; i++){
pipelined.set(i + "", i + "");
}
// 提交命令
pipelined.sync();
可以看出,使用redis.clients.jedis.Pipeline的一个实例化的对象代替了redis.clients.jedis.Jedis,使用sync()方法发送语句并等待语句执行结果。
使用管道需要注意以下几点:
1. 每条命令都不能依赖于之前命令的执行结果
2. 如果中间某条命令执行失败,不影响之后命令的执行
3. 管道中的每条命令执行期间,可以有其他线程的命令插队执行,这点与redis的事物不一样
4. 由于redis需要处理完所有命令之后再返回客户端结果,因此在这之前,需要在内存中缓存已处理完命令的结果,所以并不是打包的命令越多越好