Redis性能调优之Pipeline(管道)

您所在的位置:网站首页 redis参数调优 Redis性能调优之Pipeline(管道)

Redis性能调优之Pipeline(管道)

2023-08-14 04:26| 来源: 网络整理| 查看: 265

编程界的小学生 一、性能问题1、概述2、举例 二、什么是Pipeline三、说明四、测试五、使用场景六、总结七、个人公众号

一、性能问题 1、概述

Redis使用的是客户端-服务端这种CS模型和请求/响应的TCP服务器。这意味着通常情况下一个请求会遵循以下步骤:

客户端向服务端发送一个请求,并监听SOCKET返回,通常是阻塞模式,等待服务端响应。服务端处理客户端发来的命令并进行处理,最终将结果返回给客户端。

redis确实是非阻塞,但是redis服务端处理是非阻塞,用户端来讲还是阻塞。 至于redis为什么这么快,可以看这个一文带你彻底掌握Redis为什么这么快?

2、举例

也就是说一个客户端可以通过一个socket连接发起多个请求命令,每个请求命令发出后客户端通常会阻塞并等待redis服务器处理,redis处理完请求命令后会将结果通过响应报文返回给客户端。因为当执行多条命令的时候都需要等待上条命令执行完毕才能执行,比如:

set k1 1 keys * get k1

Redis采取IO由于通信会有网络延迟,假如 client 和 server 之间的包传输时间需要0.125秒。那么上面的三个命令6个报文至少需要0.75秒才能完成。这样即使 redis 每秒能处理100个命令,而我们的 client 也只能一秒钟发出四个命令。这显然没有充分利用 redis 的处理能力。

二、什么是Pipeline

我们已经知道上面的问题了,也知道性能是耗费再了通信上,这时候pipeline横空出世,他的目的是将一批命令打包到一个内部维护的queue里,然后建立socket与server交互,这时候是只会发送一次命令,也就是只会交互一次,然后queue内的命令都执行完后会一起返回结果,这样大大减少了通信的次数,自然降低了通信所耗费的时间。queue是先进先出,所以可以保证执行顺序。

三、说明

并不是pipeline就无敌了,以后都用这个。这需要看需求的。比如你的需求get key 实时性很高,而且要用他的返回值做处理。那你把get key这个命令与其他100个命令放到一起去批处理进行,那反而在业务角度分析,效率更为低下。

四、测试

如下demo是从https://blog.csdn.net/u011489043/article/details/78769428这个地址而来,如有侵权请联系我~

/* * 测试普通模式与 PipeLine 模式的效率: * 测试方法:向 redis 中插入 10000 组数据 */ public static void testPipeLineAndNormal(Jedis jedis) throws InterruptedException { Logger logger = Logger.getLogger("javasoft"); long start = System.currentTimeMillis(); for (int i = 0; i pipe.set(String.valueOf(i), String.valueOf(i)); } pipe.sync(); // 获取所有的 response long end_pipe = System.currentTimeMillis(); logger.info("the pipe total time is:" + (end_pipe - start_pipe)); BlockingQueue logQueue = new LinkedBlockingQueue(); long begin = System.currentTimeMillis(); for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3