多个socket IO多路复用程序 socket队列 文件事件分派器 事件处理器:连接应答处理器、命令请求处理器、命令回复处理器

1、首先 redis 是单线程的,为什么 redis 会是单线程的呢?

  1. 从 redis 的性能考虑,单线程避免了上下文频繁切换问题,效率高;
  2. 从 redis 的内部结构设计原理进行考虑,redis 是基于 Reactor 模式开发了自己的网络事件处理器:这个处理器被称为文件事件处理器(file event handler)。而这个文件事件处理器是单线程的,所以才叫 redis 的单线程模型,这也决定了 redis 是单线程的。

2、聊一聊 redis 的单线程模型构造部分?

redis 单线程模型中最为核心的就是文件事件处理器

而文件事件处理器结构包含5个部分,其实真正包含为 4 个部分(不包含 socket 队列,加上主要方便后面理解):多个 socket、IO多路复用程序、socket 队列、文件事件分派器、以及事件处理器。而事件处理器又分为3个部分为:连接应答处理器、命令请求处理器、命令回复处理器。如图:

Untitled

3、redis 单线程模型的大致工作流程及原理

客户端与redis进行通信大致流程:

1、首先在 redis 启动初始化的时候,redis 会先将事件处理器中的连接应答处理器和 AE_READABLE 事件关联起来;

2、如果客户端向 redis 发起连接,会产生 AE_READABLE 事件(步骤A),产生该事件后会被 IO多路复用程序监听到(步骤B),然后 IO 多路复用程序会把监听到的 socket 信息放入到队列中(步骤C),事件分配器每次从队列中取到一个 socket (步骤D),然后事件分派器把 socket 给对应的事件处理器(步骤E)。由于连接应答处理器和 AE_READABLE 事件在 redis 初始化的时候已经关联起来,所以由连接应答处理器来处理跟客户端建立连接,然后通过 ServerScoket 创建一个与客户端一对一对应的 socket,如叫 socket01,同时将这个 socket01 的 AE_READABLE 事件和命令请求处理器关联起来。