# 使用Pipeline加速Redis查询

原文: Using pipelining to speedup Redis quries (opens new window)

# Request/Response protocol and RTT

Redis采用客户端/服务端模型,即Request/Response protocol。

这意味着一个请求包括两个部分:

  • 客户端发送查询请求至服务端。
  • 服务端执行查询命令并返回响应。

如果需要执行多个命令时就会存在多个往返延时(RTT)。

请求示例:

  • Client: INCR X
  • Server: 1
  • Client: INCR X
  • Server: 2
  • Client: INCR X
  • Server: 3
  • Client: INCR X
  • Servre: 4

# Redis pipelining

可以通过客户端批量发送多个请求的方式加速查询。

请求示例:

  • Client: INCR X
  • Client: INCR X
  • Client: INCR X
  • Client: INCR X
  • Server: 1
  • Server: 2
  • Server: 3
  • Server: 4

**注意:**服务端需要使用内存存储查询结果,然后批量返回。因此要合理设置每一批请求的查询数量。

# It's not just a matter of RTT

每一次查询都会涉及昂贵的read()write()系统调用,从用户态切换至内核台,上下文切换也是一种性能消耗。

# Pipelining VS Scripting

TODO

# Appendix: Why are busy loops slow even on the loopback interface

即使所用Redis进程同处一个物理机也可存在缓慢操作。查询请求被写入至loopback interface缓冲中,等待Redis Server读取,而Redis Server进程需要被内核进行调度。此时可能被系统调用阻塞。