在Redis6.0之前,它的网络I/O模型是单线程的,那么它是怎么处理多个客户端的连接的呢?这里就涉及到Redis的I/O模型,基于多路复用的高性能 I/O 模型。

image-20230511204107493

我个人对它的理解如下:

它的模型需要用到操作系统的epoll机制,也就是说需要内核来监控Redis建立的多个Socket,这也就是为什么Windows操作系统发挥不了Redis的最大性能,因为它只支持Select模式,不支持epoll模式。

Redis的一个线程只需要来处理客户端的请求,为它建立一个Socket。epoll机制允许内核一次监听多个socket,每当这些socket变得可读或者可写,就通知Redis的线程,然后Redis的线程会为对应的Socket注册对应的事件,之后将他们放入事件处理队列。这是事件在出队后,会调用对应事件绑定的函数,来处理对应的事件。

比如说,现在有两个客户端,这两个客户端都发起了请求,分别对应accept事件和read事件。Redis 分别对这两个事件注册 accept 和 get 回调函数。当 Linux 内核监听到有连接请求或读数据请求时,就会触发 Accept 事件和 Read 事件,此时,内核就会回调 Redis 相应的 accept 和 get 函数进行处理。