Redis的pipeline管道用于批量读取或写入操作,减少网络开销,提供执行效率。Pipeline大致原理是把多个命令打包,然后一起发送到Redis服务器执行。pipeline的局限性有两点:
- Redis服务器是用队列来存储执行的命令,而队列是放在内存里的,所以一次性不能发送太多的命令,容易导致内存溢出,可分批次导入。
- pipeline都是打包一组命令,最后一次性执行。所以执行的命令最好不能有依赖性。例如,某个命令插入成功后,才接着后续操作。
批量写
@Test
public void testPipelineInsert() {
try (Jedis resource = pool.getResource()) {
Pipeline pipeline = resource.pipelined();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
pipeline.set("pipeline-" + i, i + "");
}
pipeline.sync();
long endTime = System.currentTimeMillis();
log.info("spend time: " + (endTime - startTime));
}
}
获取
@Test
public void testPipelineInsertAndGet() {
try (Jedis resource = pool.getResource()) {
Pipeline pipeline = resource.pipelined();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
pipeline.set("pipeline-" + i, i + "");
}
Response<List<String>> values = pipeline.mget("pipeline-7", "pipeline-9");
pipeline.sync();
values.get().forEach(System.out::println);
}
}