redis 学习 - 流水线

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

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

非事务型流水线

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

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

因为事务所使用的 multiexec 的问题, 它们俩同样会消耗资源, 因为 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  阅读(329)  评论(0编辑  收藏  举报