一、Pipeline相关概念简介
概念1、Round Trip Time(RTT-往返时间):
Redis客户端执行一条命令分为如下四个过程:
(1)发送命令、(2)命令排队、(3)命令执行、(4)返回结果
其中(1)+(4)称为Round Trip Time
概念2、Redis批量操作命令:
Redis提供了批量操作命令(例如mget、mset等),有效地节约RTT。但大部分
命令是不支持批量操作的,例如要执行n次hgetall命令,并没有mhgetall命令存在,需要消耗n次RTT
概念3、Pipeline(流水线)机制:
它能将一组Redis命令进行组装,通过一次RTT传输给Redis服务端,再将这组Redis命令的执行结果按顺序
返回给客户端。
二、原生批量命令与Pipeline的对比
原生批量命令是原子的,Pipeline是非原子的。
原生批量命令是一个命令对应多个key,Pipeline支持多个命令。
原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同实现。
三、Pipeline的局限性
1、一次Pipeline只能操作一个Redis实例,即Pipeline操作的key必须分布在同一个Redis Node上
(集群部署时需要注意,必要时需要添加hash_tag解决)
2、每次Pipeline组装的命令个数不能没有节制,否则一次组装Pipeline数据量过大,
一方面会增加客户端的等待时间,另一方面会造成一定的网络阻塞。
具体一次Pipeline合适的操作命令个数与返回的数据大小(占用Socket缓冲区)有较大关系,受限于server的物理内存或网络接口的缓冲能力。
四、Pipeline的推荐使用场景:
Pipeline在某些场景下非常有用,比如有多个command需要被“及时的”提交,而且他们对“相应结果没有互相依赖”,
对“结果响应”也无需立即获得,那么pipeline就可以充当这种“批处理”的工具;
而且在一定程度上,可以较大的提升性能,性能提升的原因主要是TCP连接中减少了“交互往返”的时间。