Redis学习笔记(十)Pipelining

Redis还提供了一种技术——Pipelining(流水线?管线?还是管道?),姑且翻译成管道吧。使用Redis的管道技术可以同时发送多个命令,以节省往返时间。

1.RTT

Redis是一个基于TCP连接的客户/服务器模型,这种模型通常由客户端发起请求,服务端接收请求并作出响应。

对Redis而言,这个过程一般是这样:客户端向服务端发起查询请求,并从套接字中读取服务端的响应数据(一般是以阻塞模式读取);服务端处理客户端发来的命令,并将命令执行的结果通过套接字返还给客户端。

比如,有如下请求/响应序列:

需要明确的是,客户端和服务端是通过网络连接通信的。从客户端发送请求包,到客户端再接收到响应包的这段时间,我们称之为往返时间(Round Trip Time, RTT)。所以,当客户端连续的执行多个请求命令时(比如向列表中不断的添加元素),势必会影响到Redis的性能。

举个例子,如果RTT为250ms(已经很慢了),那么服务器每秒最能就只能处理4个请求,即使你服务器有很好的性能也没有用。

2.管道(Pipelining

Redis使用管道技术,可以实现一次向服务器发送多个命令,并只响应一次,可以极大的节省时间。比如:

需要注意的是:当客户端使用管道技术向服务器发送多个命令后,服务器会将每个命令的执行结果添加到内存中。因此,在使用管道技术时,要合理的控制批量发送命令的个数。

3.系统调用

你以为管道技术减少的仅仅是RTT消耗的时间成本吗?NO!管道技术不仅仅靠减少RTT来提高性能,更多的是通过减少系统调用来减少的。

我们知道,系统调用意味着用户态与内核态之间的转换,这种转换往往是很耗时的。而每一次的请求/响应都会执行Socket I/O(调用read()和write()系统函数),上下文的切换必然耗费时间。使用管道技术后,我们就可以只执行一次I/O,速度当然会有提升了。

4.示例

使用Redis C客户端,观察Pipelining对速度提升的情况:

编译、运行:

不使用Pipelining耗时41ms,使用Pipelining耗时3ms。

 

参考:
https://redis.io/topics/pipelining

《Redis学习笔记(十)Pipelining》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注