推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
总结——》【Linux】
总结——》【MongoDB】
总结——》【Elasticsearch】
文章名称
- 一、概念
- 二、作用
- 三、特点
- 四、过程图
- 1、没有使用Pipeline执行n条命令,整个过程需要n次RTT
- 2、使用Pipeline 执行了n条命令,整个过程需要1次RTT
- 五、代码示例
- 六、其它
- 1、Pipeline组装的命令个数要有限制
- 2、Pipeline只能操作一个Redis实例
参考链接:Redis——》RTT
- 支持批量操作的命令(mget、mset),可以有效地节约RTT。
- 不支持批量操作的命令(执行n次 hgetall),需要消耗n次RTT。
一、概念
Pipeline = 流水线
Pipeline将一组 Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端。
二、作用
有效地节约RTT往返时间。
三、特点
- Pipeline执行速度一般比逐条执行要快。
- 客户端和服务端的网络延时越大,Pipeline的效果越明显。
四、过程图
1、没有使用Pipeline执行n条命令,整个过程需要n次RTT
2、使用Pipeline 执行了n条命令,整个过程需要1次RTT
五、代码示例
linux使用Pipeline机制:redis-cli的–pipe选项
六、其它
1、Pipeline组装的命令个数要有限制
Q:一次组装Pipeline数据量过大,会有什么影响,以及如何解决?
A:
影响:一方面会增加客户端的等待时间,另一方面会造成一定的网络阻塞。
解决:将一次包含大量命令的Pipeline拆分成多次较小的Pipeline来完成。
方案1:将Pipeline的总发送大小控制在内核输入输出缓冲区大小之内。
方案2:控制在单个TCP 报文最大值1460字节之内。
Q:内核输入输出缓冲区大小?
A:一般是4K-8K,不同操作系统会不同(当然也可以配置修改)
Q:单个TCP 报文最大值1460?
A:MTU = Maximum Transmission Unit = 最大传输单元,在以太网中最大值是1500字节
因为IP头占20字节,TCP头占20字节,所以单个TCP 报文最大值是1460
2、Pipeline只能操作一个Redis实例
即使在分布式Redis场景中,也可以作为批量操作的重要优化手段。