2023-2更文13-redis的单线程模型

71 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情

redis的单线程模型

前文

众所周知,redis是非常快的一种存储中间件,而它主要进行逻辑处理的部分则是采用了单线程的模型。本文的主要内容是对redis单线程模型相关内容的一些整理及总结。

redis的单线程模型

首先来了解一下redis的单线程模型结果。redis的单线程模型主要以下几部分组成:网络连接、epoll IO多路复用结构、事件的分发处理器以及实际的时间处理逻辑,而这几部分的关系如下图所示:

1.png 根据上述的流程可以看出,多个客户端对redis进行连接,而连接时首先redis会通过io多路复用也就是epoll进行消息的处理。接收到实际的消息后,例如连接请求,epoll会交给事件选择器,并进行实际逻辑的执行。而此时epoll会重新进入到轮训的状态,等待新请求消息的处理,包括其他客户端的连接请求、命令消息的处理以及对命令的回复处理等等。通过epoll模型,实现io的多路复用,单线程来处理io的数据,这也就是redis所采用的单线程模型。

那么redis的单线程模型不影响效率么?redis采用单线程模型的原因主要是基于redis存储方式的选择,将数据存储到内存中。根据官方的解答,redis的主要处理逻辑实际都是基于内存的,cpu并不是限制redis性能的主要因素,更主要的是网络io以及内存中的处理。基于这一点,采用单线程模型已经足够满足redis的数据处理需求。但在高版本的redis当中,实际上已经将redis的单线程模型进行了调整,修改为多线程模型,来适配当硬件速度提升时,网络io处理速度对于redis处理的影响。显然,多线程实际上也并非是用在redis的实际逻辑处理中,而是为了解决网络io处理速度的瓶颈,将其用在数据向客户端发送响应的过程中。redis的连接过程,包括实际连接后的数据处理过程,依然是采用原始的io多路复用逻辑。如果我们希望连接过程中也采用多线程时,还需要手动的进行配置。

后记

本文主要对于redis采用的单线程模型进行了介绍,同时对于redis采用单线程模型的原因进行了分析,并介绍了高版本redis中的多线程应用之处。