redis pipeline

384 阅读2分钟

概述

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();
    }
}

请求: 图片.png 响应:

图片.png

上面的结果说明了两点:

  • 客户端和服务端都是一次性的IO操作:客户端一次性请求,服务端等待请求处理后一次性响应。
  • 即使有命令失败,也不影响后面的请求处理。

参考

-Using pipelining to speedup Redis queries