Redis的管道pipeline

391 阅读3分钟

我们知道, Redis 服务器是以单线程的方式来处理客户端的网络 IO 请求的。如果每执行一次请求都要创建和断开一次连接,就会消耗过多的时间,导致执行效率降低。因此 Redis 提供了 Pipeline(管道技术),使用该技术可以一次性向服务器发送多条命令,并返回多个执行结果。这样就节省了发送命令和创建连接的时间,从而提高了执行效率。

注意:你需要在 Liunx 系统上使用 Pipeline 管道技术。

image.png

为什么需要Pipeline

Redis 是使用了客户端-服务器(C/S)模型和请求/响应协议的 TCP 服务器。这意味着发送一个请求会遵循以下步骤:

  • 客户端通常以阻塞的方式向服务器发送命令,以获取服务器的响应。

  • 服务器接收并处理命令,然后将响应发送回客户端。

所谓阻塞式,指的是只有当客户端接收完当前命令的响应信息,服务端才可以继续处理下一条指令,即一条一条的逐次执行。

不管命令是以数据包的形式从客户端传输到服务端,还是客户端获得服务端的响应信息,这个过程都需要花费一定的时间,我把这个时间称为“往返延时”。因此当客户端执行一串请求的时候很容易看出延时对其性能造成的影响。

如果我们可以减少网络请求的次数,那么就可以大幅度提高 Redis 应用性能。Redis 的 Pipeline 就是这样一种技术,它能够把多次网络请求打包成一次请求发送给服务端,从而减少多次请求的“往返时间”。

注意,记住“速度不够,管道来凑”这句话,能够帮助你牢记管道技术的作用。

执行Pipeline语句

Pipeline 技术有其固定的语法格式,以下是在 Linux 终端执行的语句,具体命令如下:

(echo -en "PING\r\n SET name www.biancheng\r\n GET name\r\n INCR num\r\n INCR num\r\n INCR num\r\n"; sleep 2)|nc localhost 6379

上述语句,首先使用 PING 命令检查 Redis 是否正常工作,然后又分别使用了 SET/GET/INCR 命令,以及 sleep 阻塞 2 秒,最后将这些命令一次性的提交给 Redis 服务器,Redis 服务器在阻塞了 2 秒之后,一次性输出了所有命令的响应信息。

注意: 每个命令字符串必须以 \r\n 结尾。至于语句最后的 nc localhost 6379 是固定格式无需更改。

客户端一次性接收到所有命令的执行结果,如下所示:

$(echo -en "PING\r\n SET name www.biancheng\r\n GET name\r\n INCR num\r\n INCR num\r\n INCR num\r\n"; sleep 2)|nc localhost 6379
+PONG
+OK
www.bianchneg.net
:1
:2
:3 

注意:上述示例需要在 Linux 系统执行,Windows 由于缺少nc命令,无法执行成功。


对于单线程阻塞式的Redis,Pipeline可以满足批量的操作,把多个命令连续的发送给Redis Server,然后一一解析响应结果。

Pipelining可以提高批量处理性能,提升的原因主要是TCP连接中减少了“交互往返”的时间。

pipeline 底层是通过把所有的操作封装成流,redis有定义自己的出入输出流。在 sync() 方法执行操作,每次请求放在队列里面,解析响应包。

链接