前言:一般来说,Redis命令真正执行的时间通常在微秒级别,一次数据读取或写入耗费时间通常与客户端和Redis服务器之间延迟情况有直接关系。所以也有Redis性能瓶颈是在网络层面的说法。在此背景下,Redis提供了pipeline(流水线)机制,其作用为将多个Redis命令打包封装,一次性发送给Redis服务端,在Redis执行完成后,将执行结果统一返回,以达到减少RTT次数,提高Redis整体吞吐量的目的。本篇主要测试pipeline(流水线)机制对于Redis的性能提升究竟有多大。
测试准备
服务器:
1.本地docker中的Redis节点
2.办公内网测试环境的Redis节点(使用办公环境内网服务器)
3.外网服务器部署Redis节点(使用Bandwagon的VPS,官网显示物理机位置为美国加利福尼亚州)
客户端:
使用Java语言,引入Jedis工具包完成对Redis的连接。
测试方法:
1.客户端通过直接set和使用pipeline(流水线)机制两种不同的方式分别for循环1000次向Redis中添加1000个带有有效时间的key,横向对比两种方式的耗时差距。
2.统计本地ping三台服务器的延迟时间,并对三台服务器使用方法1分别进行测试,纵向对比不同服务器之间的耗时差异。
测试开始
客户端测试代码如下,同时,为了避免网络抖动等环境问题导致测试结果不准确,预计一共进行五轮测试。
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1", 6379);
long startTime = System.currentTimeMillis();
// setex
// setex(jedis);
//pipeline
pipeline(jedis);
long result = System.currentTimeMillis() - startTime;
System.out.println("本次耗时为:" + result);
}
/**
* pipeline
*
* @param jedis
*/
private static void pipeline(Jedis jedis) {
Pipeline pipelined = jedis.pipelined();
for (int i = 0; i < 1000; i++) {
pipelined.setex(String.valueOf(i), 20, String.valueOf(i));
}
pipelined.sync();
}
/**
* 直接set
*
* @param jedis
*/
private static void setex(Jedis jedis) {
for (int i = 0; i < 1000; i++) {
jedis.setex(String.valueOf(i), 20, String.valueOf(i));
}
}
测试结果
docker本地:
轮次 | ping延迟 | setex耗时 | pipeline耗时 |
---|---|---|---|
第一次 | 0.12ms | 1208ms | 28ms |
第二次 | 0.14ms | 1107ms | 36ms |
第三次 | 0.12ms | 987ms | 28ms |
第四次 | 0.07ms | 1113ms | 29ms |
第五次 | 0.09ms | 912ms | 27ms |
办公网测试环境:
轮次 | ping延迟 | setex耗时 | pipeline耗时 |
---|---|---|---|
第一次 | 20.93ms | 5893ms | 102ms |
第二次 | 11.62ms | 7129ms | 57ms |
第三次 | 13.05ms | 6421ms | 77ms |
第四次 | 8.71ms | 5987ms | 53ms |
第五次 | 9.44ms | 6997ms | 58ms |
云服务器:
轮次 | ping延迟 | setex耗时 | pipeline耗时 |
---|---|---|---|
第一次 | 192.40ms | 336557ms | 1987ms |
第二次 | 182.60ms | 352612ms | 1017ms |
第三次 | 172.45ms | 331517ms | 1507ms |
第四次 | 173.05ms | 370071ms | 1125ms |
第五次 | 172.49ms | 301157ms | 987ms |
五次测试取均值:
服务器 | ping延迟 | setex耗时 | pipeline耗时 | 性能提升 |
---|---|---|---|---|
本地docker | 0.108ms | 1065.4ms | 29.6ms | 36倍 |
办公网测试服务器 | 12.75ms | 6485.4ms | 69.4ms | 93.5倍 |
云服务器 | 178.598ms | 338382.8ms | 1324.6ms | 255.5倍 |
结论
根据本次测试结果得知,在批量操作Redis的多个key时,相比于操作单个key的命令,pipeline(流水线)机制的性能提升明显,并且客户端与服务器的延迟越高,pipeline(流水线)机制的性能提升越明显。