当前位置: 首页 > 网络应用技术

REDIS事件驱动模型

时间:2023-03-06 19:44:03 网络应用技术

  Redis作为客户端服务器体系结构的数据库,在其源代码中是必不可少的,以实现网络通信。您还应该清楚地,系统实现网络通信的基本方法通常是使用套接字编程模型,包括创建套接字,侦听端口,处理连接请求以及阅读和写作请求。- 线程使每个线程负责处理客户端的请求。

  只有一个线程负责客户端请求解决和处理。如果直接使用了基本套接字模型,它将影响REDIS以支持高平行客户端访问。

  因此,为了实现高平行网络通信,我们常用的Linux操作系统提供了三个编程模型:选择,民意调查和EPOLL。在Linux上运行的REDIS通常使用Epoll模型来进行网络通信的在线通信。

  REDIS为什么通常选择Epoll模型?这三个编程模型之间有什么区别?

  为了了解选择,民意调查和EPOLL的优势,我们需要一个比较基础,这是基本的套接字编程模型。

  Redis为什么不使用基本套接字编程模型?

  当使用套接字模型实现网络通信时,您需要创建许多步骤,例如套接字,收听端口,处理连接以及阅读和写作请求。现在,我们将了解这些步骤中的关键操作,以帮助我们分析套接字模型中的插座模型。

  首先,当我们需要与服务器和客户端进行通信时,我们可以通过以下三个步骤在服务器上创建监视套接字(收听套接字)::

  完成上述三个步骤后,服务器可以接收客户端连接请求。在命令中以及时接收客户的连接请求,我们可以运行一个圆形过程,在此过程中,访问功能被调用以接收客户端连接请求。

  您需要注意的是,访问函数是阻止函数,也就是说,如果此时没有客户端连接请求,则服务器端的执行过程将始终阻止访问函数。客户连接请求要到达,接受将不再阻止,而是处理连接请求,与客户端建立连接并返回连接的套接字。

  最后,服务器可以通过调用RECV或发送函数接收和处理读取请求,或者通过刚返回的连接碰撞来接收和处理读取请求,或者将数据发送给客户端。

  代码:

  但是,从上面的代码中,您可能会发现,尽管它可以实现服务器和客户端之间的通信,但程序只能为每个调用访问函数处理一个客户端连接。因此,如果我们要处理多个并发客户端请求,我们需要使用多线程来处理通过ACCENT函数建立的多个客户端连接的请求。

  使用此方法之后,我们需要在访问函数返回连接的狭缝单词后创建一个线程,并将连接的slit Word传递给创建的螺纹。Write.write.write.write.write.write。在同一时间,服务器端的执行过程将调用访问再次功能等待下一个客户端连接。

  多线程:

  尽管此方法可以增强服务器端的并发处理能力,但REDIS的主要执行过程是由线程执行的,该过程无法在多线程方法中使用以提高并发处理能力。为Redis工作。

  还有其他方法可以帮助REDIS提高并发客户端的处理能力吗?这需要操作系统提供的IO Multi -Road Reuse功能。在基本的插座编程模型中,只能在“接受”插座函数上聆听客户连接监视案例。RECV函数只能连接到客户端发送的请求。

  由于Linux操作系统在实际应用中更为广泛,因此在本课程中,我们主要了解Linux上的IO Multi -Road Reuse机制。由Linux提供的IO Multi -Road Rease机制的三种主要类型,即Select,Poll,Poll,Poll,Poll,和epoll.below,我们将了解这三种机制的实现以及如何使用这三种机制。

  首先,让我们了解选择机制的编程模型。

  但是,在具体研究之前,我们需要知道要掌握多种公路重复使用机制的要点,以便我们可以帮助我们快速掌握不同机制的联系和差异。道路再利用机制,我们需要回答以下问题:首先,要监视多道路重用机制哪些事件?其次,可以听多少个插座来聆听多路重用机制?第三,当有一个看前 -通过-word,如何找到准备就绪-use套接字?

  选择机制中的一个重要功能是选择函数。对于选择函数,其参数包括文件描述符的数量__nfds,以及三组readFDS,writefds,deftfds,defffds和超时时间的超时时间。选择功能原型:

  您需要注意的是Linux具有每个插座的文件描述符,这是一个非负整数,用于唯一地识别该集合。因此,在Multi -Way Reuse机制的功能中,Linux通常使用文件描述符作为参数。在文件描述符的情况下,该函数还可以找到相应的套接字,然后进行监视,阅读和写作以及其他操作。

  选择函数的三个参数表示描述描述符的集合实际上是监视套接字的集合。那么为什么有三个集?

  我刚刚提出的第一个问题,即,多路重用机制将聆听插槽单词上的事件。选择功能使用三组来指示监视的三种类型,即读取数据事件,编写数据事件和异常事件。

  我们可以看到,参数readFD,WriteFD和除外的参数类型是FD_SET结构。它主要定义零件,如下所示。在它们之后,fd_mask类型是长int类型的别名,__fd_setsize的两个宏定义的定义和__NFDBITS定义定义1024和32。

  因此,FD_SET结构的定义实际上是长INT类型的数组。该数组中有32个元素(1024/32 = 32),每个元素为32-bit(可以使用long intthe位来表示文件描述符的状态。理解FD_SET结构的定义,我们可以回答第二个刚刚提出的问题。选择功能可以在每个描述符集上监视1024个描述符。

  如何使用选择机制实现网络通信

  首先,在调用SELECT函数之前,我们可以首先创建一个传递给选择函数的描述符集,然后创建一个监视集。以便允许由Select函数监视创建的监视插槽单词,我们需要将此集的描述符添加到创建的描述符集中。

  然后,我们可以调用Select函数并将创建的描述符集作为参数传递给选择函数。调用选择函数后,该程序将阻止。当Select函数检测描述性符号时准备就绪的文件描述符。

  然后,此时,我们可以在描述性符号的描述符集合中找到。到插座,有阅读事件。目前,我们阅读了有关此单词的数据。

  依次写或异常处理与相应描述符相对应的插座。

  选择功能中有两个缺陷

  民意测验机制的主要功能是轮询功能。让我们首先看一下其原型定义,如下所示:

  其中,参数 *fds是pollfd结构的数组。参数NFD表示 *FDS数组的元素数量,超时表示轮询功能块的时间时间。

  pollfd结构包含要聆听的描述符,以及要聆听描述符的事件类型。我们可以从pollfd结构的定义中看到,如下所示,pollfd结构包含三个成员变量FD,事件和reventes,这表明要侦听的文件描述符,要侦听的事件类型以及实际事件类型。

  要监视的事件类型和PollFD结构中的实际事件由以下三个宏定义(即Pollrdnorm,pollwrnorm和Pollerr)表示。它们代表可读,书面和错误事件。

  在了解轮询功能的参数之后,让我们看看如何使用轮询函数完成网络通信。该过程可以分为三个步骤:

  在第三步的周期中,其处理逻辑分为两种情况:

  实际上,与选择功能相比,轮询功能的改进是,它一次允许一个超过1024个文件的描述符。但是,当调用轮询功能时,我们仍然需要遍历每个文件描述符以检测到每个文件描述符。描述符准备就绪,然后对其进行处理。

  首先,EPOLL机制使用EPOLL_EVENT结构记录文件描述符的类型以及对监视的事件的类型,这类似于在轮询机制中使用PollFD结构的使用。

  然后,对于epoll_event结构,它包含epoll_data_t联盟变量和事件变量的整数类型。EPOLL_DATA_T组合具有记录的文件描述符的成员变量fd,并且事件变量将使用不同的宏定义值指示类型的类型EPOLL_DATA_T变量中的File_data_t变量中的事件描述符。这些类型。

  使用Select或Poll函数时,创建文件描述符集或PollFD数组后,您可以在数组中添加我们需要收听的文件描述符。

  但是对于Epoll机制,我们需要首先调用epoll_create函数以创建一个epoll实例。此EPOLL实例在内部维护两个结构,即要监视的文件描述符和已准备就绪的文件描述符,以及已经准备就绪的文件描述符,他们将返回到用户程序进行处理。

  因此,当我们使用epoll机制时,我们不需要遍历哪些文件描述性符号(例如使用Select和Poll)。这样,Epoll的效率提高了高于Select和Poll。

  创建EPOLL实例后,我们需要使用EPOLL_CTL函数将监视事件类型添加到听力文件描述符中,并使用EPOLL_WAIT函数获取文件描述符。

  了解EPOLL函数的使用。实际上,这正是因为Epoll可以自定义监视监视的描述符的数量以及可以直接返回的描述符。当REDIS设计并实现网络通信框架时,REDIS基于epoll_create,epoll_ctl,epoll_wait和其他功能,例如EPOLL机制。阅读和写作事件已包装和开发,并且网络通信的事件驱动框架是已经意识到,尽管Redis在单个线程中运行,但它仍然可以轻松地响应高持续客户端的访问。

  反应堆模型是网络服务器使用的编程模型,用于处理高并发IO请求。模型功能:

  反应堆模型处理客户端和服务器的交互过程,这三种类型的事件仅与客户端和服务器交互过程相对应,在服务器端要处理的不同类型的请求:

  三个关键角色:

  因此,现在我们已经知道,这三个字符在事件的监视,重新启动和处理上进行了交互。那么,我们如何才能在编程过程中意识到这三个的交互?这与事件驱动器不可分割。

  SO称为事件驱动程序框架是实施反应堆模型时需要实现的代码的总体控制逻辑。简而处理主循环。

  服务器程序启动时,将执行事件初始化。它的角色主要是创建需要监视的类型,并且处理程序与事件类型相对应。当服务器初始化时,事件初始化已相应完成,并且服务器程序需要输入事件捕获的主要循环,分销和处理。

  在此主循环中使用循环时,我们需要捕获事件和判断事件的类型,并调用事件在初始化期间根据事件类型创建的事件,以积极处理事件。

  例如,当发生连接事件时,服务器程序需要调用访问者处理功能以与客户端创建连接。发生阅读事件时,指示将读取或写入请求发送到服务器端。服务器程序必须调用特定的请求处理功能,从客户端连接中读取请求内容,然后完成阅读事件的处理。

  反应堆模型的基本工作机制:客户端的不同类型的请求将触发三种类型的事件:这三种事件的监视,分发和处理由反应器,受体和处理程序的三种类型的字符完成然后,这三种类型的字符将是互动的,并通过事件驱动器框架处理事件。

  原始:https://juejin.cn/post/7102692279076257806