redis客户端和服务端是通过TCP协议进行通信,在某些高并发的场景下,网络开销成了Redis速度的瓶颈,所以需要使用管道技术来实现突破。
redis的消息交互
当客户端对redis进行一次操作,客户端将请求传送给服务器,服务器处理完毕后,再将晌应回复给客户端。这要花费一个网络数据包来回的时间。过程如下:
write-->read-->write-->read
客户端是经历了写一读一写一读四个操作才完整地执行了两条指令。
可以改为:
write-->write-->read-->read
两个连续的写操作和两个连续的读操作总共只会花费一次网络来回,节省了io时间。
以下是完整的网络交互流程图:
- 客户端进程调用write 将消息写到操作系统内核为套接字分配的发送缓冲send buffer中
- 客户端操作系统内核将发送缓冲的内窑发送到网卡,网卡硬件将数据通过“网际路由”送到服务器的网卡。
- 服务器操作系统内核将网卡的数据放到内核为套接字分配的接收缓冲recvbuffer 中。
- 服务器进程调用read 从接收缓冲中取出消息进行处理。
- 服务器进程调用write 将响应消息写到内核为套接字分配的发送缓冲sendbuffer 中。
- 服务器操作系统内核将发送缓冲的内容发送到网卡,网卡硬件将数据通过“网际路由”送到客户端的网卡。
- 客户端操作系统内核将网卡的数据放到内核为套接字分配的接收缓冲recvbuffer 中。
- 客户端进程调用read 从接收缓冲中取出消息返回给上层业务逻辑进行处理。
-
使用管道技术可以显著提升Redis处理命令的速度,其原理就是将多条命令打包,只需要一次网络开销,在服务器端和客户端各一次read()和write()系统调用,以此来节约时间。
-
管道中的命令数量要适当,并不是越多越好,太多容易撑爆内存。