九、Redis之流水线
Redis是一个使用客户端-服务器模型和所谓的请求/响应协议的TCP服务器。
这意味着通常通过以下步骤完成请求:
- 客户端向服务器发送查询,并通常以阻塞方式从套接字读取服务器响应。
- 服务器处理命令并将响应发送回客户端。
客户端发送请求到服务器,服务器处理请求并响应给客户端。这个过程消耗的时间叫做RTT
(往返时间)。如果要执行多个命令,客户端每次都只发送一个命令给redis服务器执行,那么总的RTT就很高。那有没有解决方案让RTT减少呢?那就是流水线。
Redis流水线
是一种通过一次发出多个命令而不等待每个命令的响应
来提高性能的技术。可以实现一个请求/响应服务器,这样即使客户端还没有读取旧的响应,它也能够处理新的请求。这样,可以向服务器发送多个命令
,而无需等待回复
,最后一步就可以读取回复。
上图中执行了三个命令,这三个命令只消耗了一个RTT。
流水线不仅仅是一种降低与往返时间相关的延迟成本的方法,它实际上大大提高了在给定的Redis服务器中每秒可以执行的操作数量。这是因为如果不使用流水线,从访问数据结构和生成回复的角度来看,为每个命令提供服务非常便宜,但从进行套接字I/O的角度来看成本非常高。这涉及调用read()和write()系统调用,这意味着从用户端到内核端。上下文切换是一个巨大的速度损失。
当使用流水线时,许多命令通常通过一个read()系统调用读取,多个回复通过一个write()系统呼叫传递。因此,每秒执行的总查询数最初几乎随着管道的延长而线性增加,最终达到不使用管道获得的基线的10倍,如图所示。