当前位置: 首页 > Linux

为什么Redis单线程可以达到百万+QPS?

时间:2023-04-06 05:55:55 Linux

作者:codinginJianghuhttps://juejin.im/post/5e6097...性能测试报告阿里Redis的性能测试报告如下,可以达到几十万,百万QPS(暂时忽略阿里优化)Redis的),我们从Redis的设计和实现来分析Redis是如何工作的。Redis的设计与实现其实Redis主要通过三个方面来满足这种高效吞吐的性能需求。高效的数据结构复用IO模型事件机制1.高效的数据结构Redis支持几种高效的数据结构string(字符串)、hash(散列)、list(列表)、set(集合)、zset(有序集)的底层编码方式上面公开的数据结构已经过不同的优化。细说,不是本文的重点。2、多路复用IO模型假设某一时刻与Redis服务器建立了10000个长连接,阻塞IO的方法是为每个连接创建一个线程来处理,那么就需要10000个线程。同时,根据我们的经验,IO密集型操作一般设置线程数=2*CPU数+1,CPU密集型操作一般设置线程数=CPU数+1。当然,各种书籍或网上也有详细的计算公式,可以计算出一个比较合适和准确的线程数,但结果往往是一个比较小的值,比如阻塞IO,也会创建上千个线程。如果它无法承载这样的负载,它就无法提供高效的吞吐量和服务。多路复用IO模型的方法是用一个线程将这10000个建立成功的链接依次放入event_poll中,event_poll会为这10000个长连接注册一个回调函数。当一个长连接就绪(建立成功、数据读取完成等)时,会通过回调函数写入到event_poll的就绪队列rdlist中,让本单线程通过读取rdlist获取到需要的数据。需要注意的是,除了异步IO,其他I/O模型其实都可以归为阻塞I/O模型。不同的是,阻塞I/O模型在第一阶段读取数据时,如果此时数据还没有准备好,需要阻塞。第二阶段数据准备好后,将数据从内核态复制到用户态的步骤也被阻塞了。multiplexedIO模型第一阶段不阻塞,第二阶段只会阻塞。这样就可以用一个或几个线程来处理大量的连接,大大提高了吞吐量。3.事件机制Redis客户端与Redis服务器建立连接,发送命令,Redis服务器响应命令都需要通过事件机制来完成,如下图,首先是redis服务器运行,以及的AE_READABLE事件侦听套接字处于侦听状态。此时连接响应处理器的工作客户端向Redis服务器发起连接,监听套接字AE_READABLE事件产生。当IO多路复用程序监听到就绪后,将事件压入队列,文件事件派发器获取队列中的事件交给连接响应处理器处理,响应客户端建立连接成功,同时将客户端socket的AE_READABLE事件推入队列,队列中的事件会被文件事件分发器获取,交给命令请求处理器关联客户端发送一个setkeyvalue请求,clientsocket的AE_READABLE事件,当IO多路复用程序监听到就绪后,将该事件压入队列,队列中的事件由文件事件派发器获取,交给命令请求处理器进行处理关联处理。命令请求处理器关联处理完成后,需要响应客户端操作的完成。此时socket产生的AE_WRITEABLE事件会被压入队列,队列中的事件会被文件事件派发器获取并交给命令恢复处理器处理,并返回运行结果.完成后,AE_WRITEABLE事件与命令恢复处理器之间的关联将被释放。可以说,Redis的工作模式就是reactor模式结合队列,用一个serverAccept线程来处理连接建立请求,并通过IO多路复用模型,由内核来监控这些socket。一旦某个socket读写事件就绪,相应的事件就被压入队列,然后worker工作,文件事件派发器从中获取事件,交给相应的处理器执行。文件事件派发器只有在一个事件执行完成后才会从队列中获取。处理下一个事件。可以类比netty,我们一般设置bossGroup和workerGroup。默认情况下,bossGroup为1,workerGroup=2*cpu数量,这样多个线程可以处理准备好读写的事件,但是不能有耗时操作。如果有,则需要将其放入线程池,否则会降低其吞吐量。在Redis中我们可以看到两者的值都是1,为什么说存储的值不能太大呢?例如,字符串key=a存储500MB。首先,读取事件被推入队列。文件事件派发器获取到后,交给命令请求处理器处理。这里涉及到Load500MBfromdisk。比如普通SSD硬盘,读取速度为200MB/S,读取需要2.5S。读取内存中的数据速度更快。例如,在DDR4中以50G/s的速度读取500MB大约需要100毫秒。线程库一般默认为10毫秒,算是慢查询。大多数指令执行时间都在微秒级别。这时候其他socket的所有请求都会在等待过程中,会造成100毫秒的阻塞,占用更大的带宽导致吞吐量进一步下降。看完这篇文章你有收获吗?请转发分享给更多人关注“后端开发者社区”,提升Java技能关注后端开发者社区微信公众号,后台回复:码农礼包可领一份的最新技术信息。涵盖Java框架学习、架构师学习等!