pipeline
什么是流水线
1次时间=1次网络时间 + 1次命令时间
n次时间=n次网络时间 + n次命令时间
1次pipeline(n条命令) = 1次网络时间 + n次命令时间
流水线作用
命令 | N个命令操作 | 1次pipeline(N个命令) |
---|---|---|
时间 | n次网络时间 + n次命令时间 | 1次网络时间 + n次命令时间 |
数据量 | 1条命令 | n条命令 |
要注意
- redis命令时间是微秒级别的
- pipeline每次条数要控制(网络环境)
客户端实现
maven依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
没有使用pipeline
public class PipelineDemo {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
Jedis jedis = new Jedis("127.0.0.1", 6379);
for(int i = 0; i < 10000; i++) {
jedis.hset("hashkey:" + i, "field" + i, "value" + i);
}
long endTime = System.currentTimeMillis();
System.out.println("endTime - startTime = " + (endTime - startTime) + "");
}
}
时间 endTime - startTime = 164398
使用pipeline
public class PipelineDemo {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
Jedis jedis = new Jedis("127.0.0.1", 6379);
for(int i = 0; i < 100; i++) {
Pipeline pipeline = jedis.pipelined();
for(int j = i * 100; j < (i + 1) * 100; j++) {
pipeline.hset("hashkeyy:" + j, "field" + j, "value" + j);
}
pipeline.syncAndReturnAll();
}
long endTime = System.currentTimeMillis();
System.out.println("endTime - startTime = " + (endTime - startTime) + "");
}
}
endTime - startTime = 4257
使用建议
- 注意每次pipeline携带的数据量
- pipeline每次只能作用在一个Redis节点上