https://segmentfault.com/a/1190000011440752
Pipeline
1. Pipeline概念
Redis
客户端执行一条命令分为以下四个步骤:
1.发送命令
2.命令排队
3.命令执行
4.返回结果
其中,第一步+第四步称为Round Trip Time
(RTT
,往返时间).
Redis
提供了批量操作命令(例如mget
,mset
等),有效的节约RTT
.但大部分命令是不支持批量操作的,例如要执行n
次hgetall
命令,并没有mhgetall
存在,需要消耗n
次RTT
.
Pipeline
机制能改善上面这类问题,它能将一组Redis
命令进行组装,通过一次RTT
传输给Redis
,再将这组Redis
命令按照顺序执行并装填结果返回给客户端.图1.1中未使用Pipeline
执行了n次命令,整个过程需要n个RTT
.
2. 原生批量命令与Pipeline对比
可以使用Pipeline
模拟出批量操作的效果,但是在使用时需要质疑它与原生批量命令的区别,具体包含几点:
- 原生批量命令是原子性,
Pipeline
是非原子性的. - 原生批量命令是一个命令对应多个
key
,Pipeline
支持多个命令. - 原生批量命令是
Redis
服务端支持实现的,而Pipeline
需要服务端与客户端的共同实现.
3. Pipeline缺点
Pipeline
虽然好用,但是每次Pipeline
组装的命令个数不能没有节制,否则一次组装Pipeline
数据量过大,一方面会增加客户端的等待时机,另一方面会造成一定的网络阻塞,可以将一次包含大量命令的Pipeline
拆分成多次较小的Pipeline
来完成.
Pipeline
只能操作一个Redis
实例,但即使在分布式Redis
场景中,也可以作为批量操作的重要优化方法.
4. 事务
Redis
提供了简单的功能,将一组需要一起执行的命令放到multi
和exec
两个命令之间.multi
命令代表事务的开始,exec
命令代表事务结束,他们之间的命令是原子顺序执行的.在exec命令执行之前,中间命令并没有真正执行,而是暂且保存到Redis中。
Redis根据命令的不同错误有不同的处理机制:
4.1 命令错误
比如语法错误,写错命令单词了,会造成整个事务无法执行,redis数据未发生改变。
4.2 运行时错误
此时不支持回滚功能,需要开发者自己修改此类问题。