为什么在redis中使用I/O多路重用?
首先,Redis在一个线程中运行。所有操作均根据顺序进行线性执行,但是由于读取和写作操作正在等待用户输入或输出,因此I/O操作通常无法在一般情况下直接返回。这将导致I/O整个过程无法为其他客户提供服务的某个文件,并且会出现I/O Multi -Way重复使用来解决此问题。
让我们看一下传统的阻止I/O模型的工作方式:使用或文件描述符(以下称为FD),如果当前FD不可用或无法编写,则整个REDIS Serviceit将不会响应到其他操作,导致整个服务不可用。
这是传统意义,即我们在编程中使用的最具阻碍性的模型:
尽管阻止模型非常普遍且易于理解开发,因为它会影响与其他FD相对应的服务,但是当需要处理多个客户端任务时,通常不使用阻止模型。
尽管还有许多其他I/O型号,但不会在此处引入。
阻塞性I/O模型在这里无法满足需求。我们需要一个高效的I/O模型来支持REDIS的多个客户(Redis-CLI)。该模型是:
在I/O多路重用模型中,最重要的功能调用是,该方法的方法可以同时监视多个文件描述符的可读和书面情况。该方法将返回可读和书面文件的数量描述。
关于特定用法方法,互联网上有很多信息,因此我不会在此处启动介绍。
同时,还有其他I/O多路重用功能,它们比性能更好,并且可以支持更多的服务。
REDIS服务使用反应器实现文件事件处理器(每个网络连接实际上都对应于文件描述符)
文件事件处理器使用I/O Multi -Road Reuse模块同时监视多个FD。当文件事件和文件事件时,文件事件处理器将回电FD绑定事件处理器。
尽管整个文件事件处理器都在单个线程上运行,但I/O Multi -Road Reuse模块的引入已经实现了对多个FD读取和编写的监视,从而提高了网络通信模型的性能。同时,它还可以确保整个REDIS服务都简单。
I/O Multi -Road Reuse模块封装了底层,这些I/O Multi -Way Reuse功能为上层提供了相同的接口。
在这里,我们简要介绍了REDIS如何包装和和谐,简要了解该模块的功能,整个I/O Multi -Road Reuse模块已将I/O Multi -Way Re -Re Re Reuse在不同平台上的差异变平,提供了相同的功能具有相同OnesInterface的人:
同时,由于每个函数所需的参数不同,因此我们使用每个功能的参数来存储所需的上下文信息:
这些上下文信息将仅存储在上层,仅在当前的子模块中。
包装选择功能
您可以监视FD的可读,书面和错误。
在介绍该功能如何封装I/O Multi -Road Reuse模块之前,让我们看一下所使用的函数的一般过程:
REDIS文档中代码的顺序也相同。首先,初始化和:
FD通过和谐的徽标将通过并修改:
整个子模块中最重要的功能是它是实际调用功能的一部分。它的函数是返回相应的FD数组时返回I/O多路重用函数,事件的数量返回:
Redis的封装实际上是相似的。用于创建:
添加需要监视的FD,并听取中间使用使用的使用:
由于该机制略有不同,因此当功能返回时,它不需要遍历所有FD查看阅读和写作情况。当功能返回时,将提供一个数组
其中,保留了事件(,,,和)和事件的FD。
该函数只需要添加存储在数组数组数组中存储在数组中的信息的信息,然后将信息传递到上层模块:
因为Redis需要在多个平台上运行,同时为了最大程度地提高执行的效率和性能,因此它将根据不同的汇编平台选择不同的I/O Multi -Way Reuse功能作为子模块提供上层的统一界面;在上层的界面中;在上层的界面中;在上层的界面中;在界面中;在统一的界面中;在界面中;在接口中;在Redis中,我们使用宏定义合理选择不同的提交:
由于该函数被用作POSIX标准中的系统调用,因此它将在操作系统的不同版本中实现,因此将其用作保证解决方案:
REDIS将优先考虑I/O多路重用功能,而O(1)作为基础实现的时间复杂性,包括Solaries 10,Linux和MacOS/FreeBSD。文件描述符。
但是,如果当前的汇编环境没有上述功能,则将选择用作替代方案。因为它在使用时扫描所有在听所有监视的描述符,所以时间复杂性很差O(n),并且只能同时同时提供1024个文件。描述符,因此通常不使用它第一个解决方案。
Redis设计I/O多路重用模块的设计非常简洁。由Macro撰写,I/O Multi -Road Reuse模块在不同平台上具有出色的性能。相同的API可用于上限。
整个模块使Redis能够在单个过程中运行,同时提供数以万计的文件描述符,从而避免了由于引入多进程应用程序而导致代码复杂性的改善,从而减少了错误的可能性。
来自:https://draveness.me/redis-io-multiplexing