客户端和Redis使用TCP协议连接。不论是客户端向Redis发生命令还是Redis向客户端返回命令的执行结果,都需要经过网络传输,这两个部分的总耗时称往返时延。如果执行较多的命令,每个命令的往返时延累加起来对性能还是有一定影响的。在执行多个命令时每条命令都需要等待上一条命令执行完(即收到Redis的返回结果)才能执行,即使命令不需要上一条命令的执行结果,如下图:
Redis的底层通信协议对管道(pipelining)提供了支持。通过管道可以一次性发送多条命令并在执行完后一次性将结果返回,如下图;
管道压力测试
Redis自带了一个压力测试工具 redis-benchmark 使用这个工具就可以进行管道测试。首先我们对一个普通的set指令进行压测,QPS大约5w/s
> redis-benchmark -t set -q
SET: 51975.05 requests per second
我们加入管道选项 -P参数,它表示单个管道内并行的请求数量,看下面 p=2 ,QPS 达到了 9w/s。
> redis-benchmark -t set -P 2 -q
SET: 91240.88 requests per second
再看看 P=3,QPS 达到了 10w/s。 SET: 102354.15 requests per second
但如果再继续提升 P 参数,发现 QPS 已经上不去了。这是为什么呢? 因为这里 CPU 处理能力已经达到了瓶颈,Redis 的单线程 CPU 已经飙到了 100%,所以无法再继续提升了