深入学习Redis(二)对pipeline的理解

1,279 阅读1分钟

一、redis中的RTT

RTT,round trip time, 即往返时间,指的是一个请求响应的时间。redis的通信协议是基于tcp的请求/响应协议,在发送一个请求,读取到响应后才可以发送下一个请求,整个来回的时间即为RTT。

假如一个RTT的时间为250ms,那么1s内redis只能处理4个命令,这大大浪费了redis高qps的能力。


二、pipeline原理

redis中的pipeline实现原理,是让客户端在请求未得到响应时,依然可以发送下一个请求,这样多个命令就可以如同批次一样到达服务端,服务端按顺序进行处理,最后统一响应。

这里,为了能够实现统一响应,redis会将请求结果放入缓存队列中。这个缓存队列是占据服务器内存的,所以每次pipeline中的命令不能过大,否则会导致服务器内存占用过高。


三、socket I/O开销

除了RTT方面的优化,使用pipeline还可以减少socket I/O方面的调用。

每个请求/响应都需要调用系统的read()和write()命令,将数据在用户空间和内核空间内来回复制,这个时间远远大于服务器处理命令的时间,如果使用pipeline,则多个请求只需要进行一次socket IO,从而大大提高服务器的qps。根据官方文档给出的示例,随着pipeline中命令数的增加,最终redis的qps将达到未使用pipeline的十倍。


四、总结

pipeline从两方面提高查询效率

  • 通过改变请求响应的顺序,减少总的RTT
  • 减少 socket IO次数