redis 学习 - 流水线

本篇已收录至redis in action 学习笔记系列

流水线 pipelining 在 redis 中指的是可以在一次客户端与服务端的通信完成多个 redis 写入操作, 进而提升效率. redis 的事务实际上底层是依赖了流水线机制, 那么非事务情况下怎么使用.

非事务型流水线

redis 有很多命令是可以通过一个命令将多个成员写入到 server 中的. 比如 hmset, hmget, mget, mset, rpush, lpush等, 这些命令简化了需要重复执行相同命令的操作, 并且极大的提升了性能.

为什么不一直使用事务去提升性能

因为事务所使用的 multi 和 exec 的问题, 它们俩同样会消耗资源, 因为 server 在处理事务时, 不能处理其他的命令.

需要举出实例证明流水线为性能带来的提升

这里引用 redis in action 书中实例:

一个 update user token 的操作函数, 原逻辑中包含了每次执行可能会与 server 通信 2-5 次的操作. 所以这个函数需要 2 - 10 ms 去完成. 按照这个速度来计算, 单个服务器每秒可以处理 100 - 500 个请求.

看一下使用流水线优化的函数:

此时一次update操作, 与 server 的通讯次数降低了 1/2 或者 1/5, 那么每秒钟 server 能够处理的请求就提高至 500 - 1000 个请求.

理论上看, 这个提升已经很不错了. 那么经过实际测试呢. 作者使用了两个 client 环境模拟测试, 一个是低延迟网络环境, 另外一个是慢速高延迟网络环境, 访问的都是同一个 server.

测试代码:

测试结果如下:


可以看到, 如果收到网络环境的影响, 效率与性能问题的相差还是很明显的.

posted @ 2020-03-31 09:45  YanyuWu  阅读(352)  评论(0)    收藏  举报