redis线程模型

Redis 使用文件事件处理器处理网络事件。

  • 文件事件处理器使用 I/O 多路复用 (select, poll, epoll, kqueue) 来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器。(自动选择系统中性能最高的 I/O 多路复用函数库来作为 Redis 的 I/O 多路复用程序的底层实现)
  • 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

文件事件处理器

文件事件处理器由:socket、 I/O 多路复用程序、 文件事件分派器、 以及事件处理器 组成。

I/O 多路复用程序将所有产生事件的套接字都入队到一个队列,当上一个套接字产生的事件被处理完毕之后(该套接字为事件所关联的事件处理器执行完毕), I/O 多路复用程序才会继续向文件事件分派器传送下一个套接字。

https://tva1.sinaimg.cn/large/007S8ZIlly1gizdppikwfj31e30u0n5g.jpg

连接实例

  1. 客户端向Redis服务器发起连接,监听socket的IO多路复用程序传递给文件事件分派器,分派到连接应答处理器,对客户端的连接请求进行应答,然后建立状态。然后将此事件与命令请求处理器进行关联,使得客户端可以向主服务器发送命令请求。
  2. 客户端向Redis服务器发送一个命令请求,命令请求处理器读取命令并传递到其他程序执行。
  3. 为了将这些命令回复传送回客户端,服务器将事件命令回复处理器进行关联。当客户端尝试读取命令回复时,命令回复处理器将命令回复全部写入到socket。然后解除关联。