Redis奇幻之旅(三)8. 管道

8. 管道

​ 管道(pipeline)并不是Redis独有的一个功能,也不是Redis先提出的。Redis是用的C/S架构模型,请求和响应是由RESP(在《3.3 Redis的通信协议》中有详细说明)来处理数据的,并且它基于ISO/OSI七层模型中传输层的TCP协议来交互数据。因此Redis不可避免的用到了网络,我们知道网络是及其不可靠的,可能响应极快也可能延时很久。由于网络的这个特性,管道在很早以前就被提出,用于解决RTT(Round Trip Time)过长的问题。其思路非常简单,就是将多个客户端请求打包成一个请求,传给服务器,等待服务器全部处理完成之后,再将所有响应返给客户端。

​ 给一段python中pipeline的使用案例:

pipe = redis.pipeline()
redis_set_key = 'redis_set_key'
pipe.sadd(redis_set_key, user_id)
pipe.expire(redis_set_key, 3600 * 24)
is_sadd_success, is_expire_success = pipe.execute()

8.1 管道和事务的区别

​ 管道只用一次IO,而事务会使用多次IO,并且处于事务状态还会修改client的flags。管道是在客户端拼接请求,而事务是在服务端进行命令缓存的。事务还可以监控处于缓存中的key,管道则没有这些功能。

8.2 管道和lua脚本的区别

​ lua脚本是原子性的,但是管道还是在执行多个命令,这些命令并不是原子性执行的。在lua脚本中我们可以用前命令的结果来进行下一步操作,而管道不能这么使用。

你可能感兴趣的:(Redis奇幻之旅(三)8. 管道)