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()调用,在并发和请求量很大的情况下,资源的节省是非常可观的。 压测如图所示: