Redis Pipeline
概述
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()
系统调用的性能开销。
需要特别注意的是,使用管道的时候,服务端需要缓存所有命令的结果,并在全部处理结束后一次性发回。因此我们需要注意,不能一次性发送太多命令,最好的办法是分批发送,这样既能提供性能,同时不会过度消耗服务端内存。另外管道中的命令不是原子操作,命令在服务端仍然是一条一条执行的。
有问题吗?点此反馈!
温馨提示:反馈需要登录