Pipeline

当您有批量操作、提高命令执行性能等需求时,您可以使用Redis管道传输(Pipeline,后面称为Pipeline)机制。Pipeline可以将多个命令同时发给Redis服务端,减少网络延迟,并提高性能

Pipeline简介

通常情况下,客户端与Redis通信时采用的是Ping-pong网络交互模式,Ping-pong模式是指客户端(Client)发送一个命令后会等待命令的执行结果,在客户端收到服务器端(Server)返回的结果后,再发送下一个命令,以此类推。

Redis也支持Pipeline模式,不同于Ping-pong模式,Pipeline模式类似流水线的工作模式:客户端发送一个命令后无需等待执行结果,会继续发送其他命令;在全部请求发送完毕后,客户端关闭请求,开始接收响应,收到执行结果后再与之前发送的命令按顺序进行一一匹配。在Pipeline模式的具体实现中,大部分Redis客户端采用批处理的方式,即一次发送多个命令,在接收完所有命令执行结果后再返回给上层业务。

下图为Ping-pong模式与Pipeline模式的网络通信示意图。

使用Pipeline可通过将多个命令打包到一起然后一次性发送给 Redis 服务器,降低网络往返时延(Round-trip time,简称RTT),减少read()write()的系统调用以及进程上下文切换次数,以提升程序的执行效率与性能。

Pipeline在某些场景下非常有效,例如有多个操作命令需要被迅速提交至服务器端,但用户并不依赖每个操作返回的响应结果,对结果响应也无需立即获得,那么Pipeline就可以用来作为优化性能的批处理工具。

重要

使用Pipeline时客户端将独占与服务器端的连接,此期间将不能进行其他“非Pipeline”类型操作,直至Pipeline被关闭;如果要同时执行其他操作,可以为Pipeline操作单独建立一个连接,将其与常规操作分开。

注意事项

  • Pipeline不能保证原子性。

    Pipeline模式只是将客户端发送命令的方式改为发送批量命令,而服务端在处理批量命令的数据流时,仍然是解析出多个单命令并按顺序执行,各个命令相互独立,即服务端仍有可能在该过程中执行其他客户端的命令。如需保证原子性,请使用事务或Lua脚本。

  • 若Pipeline执行过程中发生错误,不支持回滚。

    Pipeline没有事务的特性,如待执行命令的前后存在依赖关系,请勿使用Pipeline。

  • Pipeline 每批打包的命令不能过多,因为 Pipeline 方式打包命令再发送,那么 Redis 必须在处理完所有命令前先缓存起所有命令的处理结果。这样就有一个内存的消耗,可以将大量命令拆分为多个小的Pipeline命令完成。
posted on 2024-06-09 14:14  zhengbiyu  阅读(35)  评论(0编辑  收藏  举报