Qiuliang's Site

做一个独立思考和具备创新能力的人,打造谦逊和强大的内心

redis pipeline和mget、mset

为什么需要pipeline?

因为redis本身是基于request/response模式,每一个命令都需要等待上一个命令响应后进行处理,中间需要经过RTT(Round Time Trip,往返延时,表示发送端从发送数据开始,到发送端收到来自接收端的确认,所需要的时间。),并且需要频繁调用系统IO。

pipeline应用场景

多个命令需要被及时提交,且这些命令的响应结果没有相互依赖。

好处

可较大提升性能

需要注意

  • 不要和常规命令client共用一个链接,因为pipeline是独占连接的,如果管道内命令太多,可能会造成请求超时
  • 可发送命令数量受到客户端缓冲区大小限制,如超过限制,则flush到redis
  • redis server存在query buffer限制,默认是1GB,如果超过这个值,客户端会被强制断掉
  • redis server存在output buffer限制,受到maxmemory配置限制
  • 要实现pipeline,同时需要服务器端和客户端的支持
  • redis cluster不建议使用pipeline,容易产生max redirect错误
  • twem proxy可以支持pipeline

局限性

当某个命令的执行需要依赖前一个命令的返回结果时,无法使用pipeline。

mget和mset

mset a “a1” b “b” c “c1” mget a b c

mget和mset命令也是为了减少网络连接和传输时间所设置的,其本质和pipeline的应用区别不大,但是在特定场景下只能用pipeline实现,例如:

get a
set b ‘1’
incr b

pipeline适合执行这种连续,且无相关性的命令。

根据大家的测试反馈,在key数量非常多的时候,mget命令性能可能优于pipeline。(未做实测考证)