当前位置:   article > 正文

Redis线程模型

redis线程模型
一、概述

Redis线程模型主要是基于Reactor模式开发的网络事件处理器,这个处理器被称为文件事件处理器(file event handler),也就是说Redis线程模型指的就是文件事件处理器。文件事件处理器是单线程模式运行的,所以也叫单线程模型。但是通过IO多路复用机制监听多个socket,可以实现高性能的网络通信模型,又可以跟内部其他单线程的模块进行对接,保证了redis内部的线程模型的简单性。

二、文件事件类型

文件事件有两种类型:读事件(AE_READABLE)、写事件(AE_WRITABLE)。
(1)AE_READABLE:主要指的是客户端发送到redis服务器的所有请求命令(包含get、set等等命令)时产生的事件。
(2)AE_WRITABLE:只要指的是redis执行完客户端发送的请求命令后,返回执行结果到客户端是产生的事件。

三、文件事件处理器组成部分

文件事件处理器结构包含4个部分:多个socket,IO多路复用程序,文件事件分派器,事件处理器(命令请求处理器、命令回复处理器、连接应答处理器)。
在这里插入图片描述
(1)多个scocket:文件事件就是对socket操作的抽象,每当一个socket 准备好执行连接accept、read、write、close等操作时,与操作相对应的文件事件就会产生。多个 socket 可能会并发产生不同的操作,每个操作又会生成对应的文件事件。
(2)I/O多路复用程序:负责各事件的监听(连接、读、写等),当有事件发生时,将对应事件放入队列中。
(3)文件事件分派器:负责接受I/O多路复用程序传递过来的文件事件,并根据文件事件关联的事件处理器,将该事件分派给对应的事件处理器去处理。
(4)事件处理器:

  1. 连接应答处理器:负责客户端的接入操作。
  2. 命令请求处理器:当客户端接入成功后,负责处理客户端发送的读、写等请求命令。
  3. 命令回复处理器:当处理完客户端发送的请求命令后,将执行的结果返回给客户端。
四、文件事件处理通信流程

在这里插入图片描述
(1)连接流程:
在这里插入图片描述

  1. 首先在redis启动初始化的时候,redis中的I/O多路复用程序会监听serverSocket并且将事件处理器中的连接应答处理器和AE_READABLE事件关联起来。
  2. 当客户端跟redis发起连接时,serverSocket会产生一个AE_READABLE事件,然后被I/O多路复用程序监听到后传递给文件事件分派器。
  3. 文件事件分派器再分配给redis初始化时与AE_READABLE事件关联的连接应答处理器去处理。
  4. 连接应答处理器完成与客户端的连接后,会创建一个与客户端一 一对应的socket,同时将这个socket的AE_READABLE事件跟命令请求处理器关联起来,后续该客户端的所有请求都是在这个socket上进行操作。我们可以把这个新建的socket叫作socket01,以便与其他客户端连接成功生成的socket进行区分,不同的客户端与serverSocket完成连接后都会创建一个与之一一对应的socket。

(2)命令执行流程:

在这里插入图片描述

  1. 客户端发送一个set key value命令到socket01。
  2. socket01会产生一个AE_READABLE(读事件)事件。
  3. I/O多路复用程序监听到socket产生的AE_READABLE事件。
  4. I/O多路复用程序将该事件放入到socket队列中。
  5. 文件事件分派器读取socket队列中的事件,将该socket中的命令交给与该事件关联的命令请求处理器去处理。
  6. 命令请求处理器读取socket01中的请求命令并执行完该命令后,会准备好需要返回给客户端的数据,并将socket01的AE_WRITABLE事件和命令回复处理器关联起来。
  7. 当客户端准备接收redis返回的数据时,会产生一个AE_WRITABLE事件,该事件被I/O多路复用程序监听到后放入socket队列中,再由文件事件分派器分配给该事件关联的命令回复处理器去处理。
  8. 命令回复处理器将待返回到客户端的数据写入到socket01中,写入完成之后会删除这个socket01的AE_WRITABLE事件和命令回复处理器的关联。
  9. socket01最终将命令处理的结果返回到客户端,完成一次命令的执行流程。
五、单线程模型的优缺点

优点:
(1)模型比较简单,所有的处理过程都在一个连接,避免多线程同步机制的开销。
(2)只用一个主线程来处理,可以有效的避免多线程上下文切换带来的损耗。
(3)实现上比较容易,可维护性强。
缺点:
(1)只有一个线程,连接处理和业务处理共用一个线程,无法充分利用CPU多核的优势。
(2)当流量比较大、读写事件比较耗时情况下,容易导致系统出现性能瓶颈。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/575175
推荐阅读
相关标签
  

闽ICP备14008679号