Redis pipeline的深入解析

发表时间: 2024-05-02 21:53

管道技术:Redis的pipeline可以一次性发送多条命令给服务端处理,也就是批处理。

为什么需要pipeline呢

Redis本身是基于一个请求一个响应方式的同步请求,正常情况下,客户端发送一个命令,等待Redis服务器返回结果,如果同时需要执行大量的命令,需要频繁调用系统IO、发送网络请求,非常影响性能。pipeline 通过减少客户端与 redis 的通信次数来实现降低往返延时时间,提高执行效率。

数据包从客户端到达服务器,并从服务器返回数据回复客户端。 这个时间被称之为 RTT (Round Trip Time - 往返时间)

Pipeline与原生批量命令对比

  • 原生批量命令是原子性(例如:mset, mget),pipeline是非原子性
  • 原生批量命令一次只能执行一种命令,pipeline支持批量执行不同命令
  • 原生批命令是服务端实现,而pipeline需要服务端与客户端共同完成

Pipeline与事务对比

  • pipeline选择客户端缓冲,multi选择服务端缓冲
  • 请求次数的不一致,multi需要每个命令都发送一次给服务端,pipeline最后一次性发送给服务端,请求次数相对于multi减少

pipeline与lua脚本对比

  • 脚本可以实现类似pipeline一次I/O处理多个命令的场景,同时可以解决命令之间的依赖问题
    • pipeline由于是发送批量请求,但是一次响应结果,所以在拿到响应结果之前无法判断操作是否成功,即发送的批量请求之间不支持相互依赖
    • lua脚本同样是客户端一次请求,服务端执行多个命令,由于脚本可以支持判断,所以可以支持命令之间的相互依赖和逻辑处理

1、cluster并不支持pipeline操作

2、使用pipeline组装的命令个数不能太多

3、pipeline缓冲的指令只是会依次执行,但是不能保证原子性,如果执行中间某一个指令发生异常,将会继续执行后续的指令