1次网络命令通讯模型
批量网络命令通讯模型
什么是流水线
将单条命令进行打包,将多条命令进行打包,一次pipeline将以一次网络执行,执行n次命令执行以减少多次网络开销。
流水线的作用
命令 | N个命令操作 | 一次pipeline(n个命令) |
---|---|---|
时间 | n次网络 + n次命令 | 1次网络 + n次命令 |
数据量 | 1条命令 | n条命令 |
两点注意
- Redis的命令时间是微秒级别,网络时间才是真正需要控制的
- pipeline每次条数要控制(网络)
pipeline-Jedis实现
maven依赖
<dependency>
<groupId>reids-clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<type>jar</type>
<scope>compile<scope>
</dependency>
没有pipeline的情况下,执行多条命令
Jedis jedis = new Jedis("127.0.0.1", 6379);
for (int i=0; i<10000; i++) {
jedis.hset("hashkey:" + i, "field" + i, "value" + i);
}
1w次hset,花销50s,这是无法接受的。
使用pipeline
Jedis jedis = new Jedis("127.0.0.1", 6370);
for (int 1 = 0; i<100; i++) {
Pipeline pipeline = jedis.pipelined();
for (int j = i*100; j<(i+1)*100; j++) {
pipeline.hset("hashkey:" + j, "field" + j, "value" + j);
}
pipeline.syncAndReturnAll();
}
1w次hset,花销0.7s,这是可以接受的。
与原生M操作
原生的操作
pipeline操作
返回的结果是顺序的
使用建议
- 注意每次pipeline携带数据量
- pipeline每次只能作用在一个Redis节点上
- M操作与pipeline区别