pipeline出现的背景
redis客户端执行一条命令分4个过程:
发送命令-〉命令排队-〉命令执行-〉返回结果
这个过程称为Round trip time(简称RTT, 往返时间),Redis的原生批命令(mget和mset)有效节约了RTT,但大部分命令(如hgetall,并没有mhgetall)不支持批量操作,需要消耗N次RTT ,这个时候需要pipeline来解决这个问题。
pipeline可以将多次IO往返的时间缩减为一次RTT ,前提是pipeline执行的指令之间没有因果相关性。
未使用pipeline执行N条命令:
使用了pipeline执行N条命令:
原生批命令(mset, mget)与Pipeline对比
- 原生批命令是原子性,pipeline是非原子性。pipeline命令中途异常退出,之前执行成功的命令不会回滚。
- 原生批命令一命令多个key, 但pipeline支持多命令(存在事务),非原子性。
- 原生批命令是服务端实现,而pipeline需要服务端与客户端共同完成。
pipeline的使用注意事项
使用pipeline组装的命令个数不能太多,不然数据量过大,增加客户端的等待时间,还可能造成网络阻塞,可以将大量命令的拆分多个小的pipeline命令完成。