redis

pipeline(管道)

Posted by Liangjf on March 30, 2020

redis pipeline(管道)

通信方式

redis的请求应答是典型的C/S模式,通信方式如下:

RTT问题

这样的一次请求的总时间称为RTT,RTT取决于网络的路径长短,网络质量。局域网的RTT就很短,但是跨地域,跨国家的广域网RTT就会很高了。

因此假如redis server每秒可以响应10W请求,但是1次RTT是200ms,那么实际真正1秒只能响应5个请求。

  • 1、业务一个请求需要多个key的数据,而且比较频繁的话,走pipeline方式效率更高,把多个RTT化为1个RTT
  • 2、当请求次数很多很频繁时,可以分批pipeline,这样真正的耗时是基本一样的,但是内存的消耗比一次性大量pipeline通信低,因为走pipeline方式的话,中间等待和完成的命令请求是存放在内存中的。

syscall问题

其实不仅仅是RTT问题,每次的请求响应还涉及到系统调用问题,从上面的通信方式可以看到,一次的redis请求会发生多次的read(),write()系统调用,即发生多次的用户态和内核态的切换,这些都是需要耗时的。

因此通过pipeline,单个read()来接收redis server的多个wirte()结果,就相当于节省了n个read()调用,在并发和请求量很大的情况下,资源的节省是非常可观的。 压测如图所示: