Redis客户端执行一条命令分为如下四个过程:
1)发送命令
2)命令排队
3)命令执行
4)返回结果
其中1)+4)称为Round Trip Time(RTT,往返时间)。
Pipeline(它能将一组Redis命令进 行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端,图3-5为没有使用Pipeline执行了n条命令,整个过程需要n次 RTT。
使用Pipeline执行了n次命令,整个过程需要1次RTT。
redis-cli的–pipe选项实际上就是使用Pipeline机制,例如下面操作将
set hello world和incr counter两条命令组装:
echo -en '*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n*2\r\n$4\r\nincr\r\ n$7\r\ncounter\r\n' | redis-cli --pipe 193
大部分开发人员更倾向于使用高级语言客户端中的Pipeline,目前大 部分Redis客户端都支持Pipeline,后面介绍如何通过Java的Redis客 户端Jedis使用Pipeline功能。
原生批量命令与Pipeline对比
可以使用Pipeline模拟出批量操作的效果,但是在使用时要注意它与原 生批量命令的区别,具体包含以下几点:
·原生批量命令是原子的,Pipeline是非原子的。
·原生批量命令是一个命令对应多个key,Pipeline支持多个命令。
·原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户 端的共同实现。
最佳实践
Pipeline虽然好用,但是每次Pipeline组装的命令个数不能没有节制,否 则一次组装Pipeline数据量过大,一方面会增加客户端的等待时间,另一方 面会造成一定的网络阻塞,可以将一次包含大量命令的Pipeline拆分成多次 较小的Pipeline来完成。