概述
Redis pipeline有两个含义:
- 由于Redis是request/response模型的服务,对于一个连接的请求必须要等待结果返回后才能发送下一个请求。pipeline允许在一个连接上,一个请求还没有返回的情况下,可以继续发送下一个请求。
- 当有多个命令要发送的时候,没有必要一条一条发送。对于客户端而言可以进行一次系统调用就可以将请求全部发送出去,对于服务端而言,可以进行一次系统调用就可以读取所有请求。Redis server处理完这些命令之后,一次性将这些命令的返回值返回给客户端。由于Redis server需要缓存这些命令的结果,所以,如果一次pipeline的命令很多,返回值很大,会很浪费内存。
pipiline性能比较高的原因,也主要来自两个方面:
- RTT(round trip time):一个请求的完整路径,是从客户端到达服务端,服务端处理完请求后,将结果返回给客户端,一去一回。假设有4个命令,如果一个一个发送的话,需要进行4次RTT;如果4个命令一起发送的话,只需要1次RTT。
- 用户态/内核态切换:一次read/write操作,需要在用户态、内核态切换。
测试
public class PipelineTest {
// 下面的4个key都是string类型的。
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
Pipeline pipeline = jedis.pipelined();
pipeline.get("A");
pipeline.get("B");
// 这个会报错,那么会影响下面的请求吗?
pipeline.hgetAll("C");
pipeline.get("D");
pipeline.sync();
jedis.close();
}
}
请求:
响应:
上面的结果说明了两点:
- 客户端和服务端都是一次性的IO操作:客户端一次性请求,服务端等待请求处理后一次性响应。
- 即使有命令失败,也不影响后面的请求处理。