前言
redis作为一个缓存服务器,每个命令都要经过网络才能到达服务器。而命令在网络传输的过程中必然消耗时间,如果命令在网络传输的时间和命令执行的时间在一个数量级(甚至更多)的话,会造成大量的无效时间浪费。为了解决这个问题,redis引入了pipeline的概念,即把多个命令打包一起发送服务器,然后把多个结果一起返回。下面演示如何使用jedis进行pipeline批量操作。
样板代码
单条发送
void testNormal() {
long s = System.currentTimeMillis()
Jedis jedis = pool.getResource();
for (int i = 0; i < 10000; i++) {
String res = jedis.set("pipeline" + i, "value" + i) //发送数据并等待应答
}
long time = System.currentTimeMillis() - s;
System.err.println("10000个命令【单条发送】总耗时:" + time)
jedis.close()
}
10000个命令【单条发送】总耗时:9121
多条发送
pipeline批量
void testPipeline() {
long s = System.currentTimeMillis()
Jedis jedis = pool.getResource()
Pipeline pipeline = jedis.pipelined()
for (int i = 0; i < 10000; i++) {
pipeline.set("pipeline" + i, "value" + i)
}
pipeline.syncAndReturnAll() //关闭管道,同步获取所有结果(不加这句服务器也会放入数据,但是拿不到所有结果)
long time = System.currentTimeMillis() - s
System.err.println("10000个命令【批量发送】总耗时:" + time)
jedis.close()
}
10000个命令【批量发送】总耗时:232
结论
对于批量操作,redis的pipeline(管道)的效率比命令单个发送节省了不少网络传输时间。