Redis——线程和 IO 概述
2024-04-24 10:13:01 8 举报
Redis——线程和 IO 概述
作者其他创作
大纲/内容
socket2
socket文件事件就是对 socket 操作的抽象, 每当一个 socket 准备好执行连接accept、read、write、close 等操作时, 就会产生一个文件事件。一个服务器通常会连接多个 socket, 多个 socket 可能并发产生不同操作,每个操作对应不同文件事件。
文件事件分派器
socketn
文件事件处理器服务器会为执行不同任务的套接字关联不同的事件处理器, 这些处理器是一个个函数, 它们定义了某个事件发生时, 服务器应该执行的动作。Redis 为各种文件事件需求编写了多个处理器,若客户端连接 Redis,对连接服务器的各个客户端进行应答,就需要将 socket 映射到连接应答处理器写数据到 Redis,接收客户端传来的命令请求,就需要映射到命令请求处理器从 Redis读数据,向客户端返回命令的执行结果,就需要映射到命令回复处理器当主服务器和从服务器进行复制操作时, 主从服务器都需要映射到特别为复制功能编写的复制处理器。
文件处理器(单线程)
文件事件分派器文件事件分派器接收 I/O 多路复用程序传来的 socket, 并根据 socket 产生的事件类型, 调用相应的事件处理器。
......
队列(IO多路复用器)
连接应答处理器
命令请求处理器
socket1
socket3
命令回复处理器
I/O 多路复用程序的实现Redis 的 I/O 多路复用程序的所有功能都是通过包装常见的 select、epoll、evport 和 kqueue 这些 I/O 多路复用函数库实现的。每个 I/O 多路复用函数库在 Redis 源码中都对应一个单独的文件:因为 Redis 为每个 I/O 多路复用函数库都实现了相同的 API , 所以 I/O 多路复用程序的底层实现是可以互换的。Redis 在 I/O 多路复用程序的实现源码`ae.c`文件中宏定义了相应规则,使得程序在编译时自动选择系统中性能最高的I/O 多路复用函数库作为 Redis 的 I/O 多路复用程序的底层实现:性能降序排列。
Redis 中的线程和 IO 概述:Redis 基于 Reactor 模式开发了自己的网络事件处理器 - 文件事件处理器(file event handler,后文简称为 FEH),而该处理器又是单线程的,所以 redis设计为单线程模型。采用 I/O 多路复用同时监听多个 socket,根据 socket 当前执行的事件来为socket 选择对应的事件处理器。当被监听的 socket 准备好执行 accept、read、write、close 等操作时,和操作对应的文件事件就会产生,这时 FEH 就会调用 socket 之前关联好的事件处理器来处理对应事件。所以虽然 FEH 是单线程运行,但通过 I/O 多路复用监听多个 socket,不仅实现高性能的网络通信模型,又能和 Redis 服务器中其它同样单线程运行的模块交互,保证了 Redis 内部单线程模型的简洁设计。下面来看文件事件处理器的几个组成部分。
IO多路复用器(6.0版本改成多线程处理)
I/O 多路复用程序I/O 多路复用程序会负责监听多个 socket。尽管文件事件可能并发出现, 但 I/O 多路复用程序会将所有产生事件的socket 放入队列, 通过该队列以有序、同步且每次一个 socket 的方式向文件事件分派器传送 socket。当上一个 socket 产生的事件被对应事件处理器执行完后, I/O 多路复用程序才会向文件事件分派器传送下个 socket, 如下:
0 条评论
下一页