redis本身处理速度很快,但是如果你连续调用10条redis命令,它们要有10个网络来回,这速度就会降下来了,那么有没有办法把这10条命令一起发送到服务端呢?有,它就是redis管道
redis管道的本质是将要发往redis服务端执行的命令在客户端缓存起来,比如说缓存100条,然后你可以将这100条命令一起发送到redis服务端,从而将100个网络来回降低到1个来回,大大降低了网络开销,提升了性能。
优点:
特点:
从下方的流程图,可以看出区别:
1.命令在哪里缓存:
2.命令中出现语法错误,是否影响其他命令:
3.命令执行过程:
事务流程图:
管道流程图:
下面就来对比一下使用管道和不使用管道的速度差异。
public class JedisDemo { private static int COMMAND_NUM = 1000; private static String REDIS_HOST = "Redis服务器IP"; public static void main(String[] args) { Jedis jedis = new Jedis(REDIS_HOST, 6379); withoutPipeline(jedis); withPipeline(jedis); } private static void withoutPipeline(Jedis jedis) { Long start = System.currentTimeMillis(); for (int i = 0; i < COMMAND_NUM; i++) { jedis.set("no_pipe_" + String.valueOf(i), String.valueOf(i), SetParams.setParams().ex(60)); } long end = System.currentTimeMillis(); long cost = end - start; System.out.println("withoutPipeline cost : " + cost + " ms"); } private static void withPipeline(Jedis jedis) { Pipeline pipe = jedis.pipelined(); long start_pipe = System.currentTimeMillis(); for (int i = 0; i < COMMAND_NUM; i++) { pipe.set("pipe_" + String.valueOf(i), String.valueOf(i), SetParams.setParams().ex(60)); } pipe.sync(); // 获取所有的response long end_pipe = System.currentTimeMillis(); long cost_pipe = end_pipe - start_pipe; System.out.println("withPipeline cost : " + cost_pipe + " ms"); } }
结果也符合我们的预期:
withoutPipeline cost : 11791 ms withPipeline cost : 55 ms
版权声明:本文为CSDN博主「jackletter」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010476739/article/details/105252038