Redis Pipeline

Last Modified: 2022/11/13

概述

Redis 管道是用来提高性能的利器,利用管道技术我们可以一次性给 redis 发多条命令,然后一次性返回所有结果,避免了一次一条命令所带来的网络延迟和系统调用的开销。

请求响应协议和 RTT

Redis 是 TCP 服务器,使用的是 client-server 模型,即请求响应协议。所以一条命令需要经过以下两步:

  • 客户端发送命令请求到服务器,同时通过 socket 读取服务端响应,读的过程通常是阻塞的;
  • 服务器端处理命令,发送响应给客户端。

客户端发送数据包到服务端,服务端发回响应这两个时间之和称之为 RTT。可以看出如果有多命令需要处理,会很影响性能。

Redis 管道

Redis 管道其实就是一次性发送多条命令到服务器,这些命令在服务器端处理完毕之后,一次性返回所有结果。

(printf "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379

简单计算下时间差别,假设发送 1 万条命令到服务器,如果不借助管道那么时间为:

cost_time = 10000 * RTT + 1000条命令的处理时间

借助于管道技术

cost_time = RTT + 1000条命令的处理时间

可以看出,RTT 相差巨大,如果网络连接慢,时间差将会表现的淋漓尽致。当然我们只是近似计算,实际上并不仅仅只有 RTT 的区别,还有系统调用的所产生的性能差别,如果没有管道,1 万条命令每条命令都会产生 read()write() 系统调用的性能开销。

需要特别注意的是,使用管道的时候,服务端需要缓存所有命令的结果,并在全部处理结束后一次性发回。因此我们需要注意,不能一次性发送太多命令,最好的办法是分批发送,这样既能提供性能,同时不会过度消耗服务端内存。另外管道中的命令不是原子操作,命令在服务端仍然是一条一条执行的。

有问题吗?点此反馈!

温馨提示:反馈需要登录