IO多路复用程序

167 阅读2分钟

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

IO多路复用程序

redis的io多路复用程序是通过包装一些函数库来实现的,每个io多路复用函数库在reids源码中都对应一个单独的文件,每个io多路复用函数库都实现了相同的API,可以互换,程序会在编译的时候自动选择系统中性能最高的io多路复用函数库

io多路复用程序可以监听多个套接字的AE_READABLE事件和AE_WRITABLE事件,

AE_READABLE:当套接字变得可读时,或者有新的可应答套接字出现时,套接字产生AE_READABLE事件。

AE_WRITABLE:当套接字变得可写时,套接字产生AE_WRITABLE事件。

io多路复用程序允许服务器同时监听套接字的AE_READABLE事件和AE_WRITABLE事件,如果一个套接字同时产生了两个事件,文件事件分派器会优先处理AE_READABLE事件,然后再处理AE_WRITABLE事件。一个套接字可读又可写,服务器会先读套接字再写套接字。

文件事件的处理器

文件事件处理器有连接应答处理器,命令请求处理器,命令回复处理器等等

redis客户端向服务器发起连接,监听套接字产生AE_READABLE事件,触发连接应答处理器执行。处理器会对客户端的连接请求进行应答,然后创建客户端套接字,以及客户端状态,并将客户端套接字的AE_READABLE事件与命令请求处理器进行关联,使得客户端可以向主服务器发送命令请求。

客户端向主服务器发送请求命令,客户端套接字产生AE_READABLE事件,引发命令请求处理器执行,处理器读取客户端命令内容,然后传给相关程序去执行。执行命令产生命令回复,服务器将客户端套接字的AE_WRITABLE事件与命令回复处理器进行关联。当客户端尝试读取命令回复的时候,客户端套接字将产生AE_WRITABLE事件,触发命令回复处理器执行,当命令回复处理器将命令回复全部写入套接字后,服务器解除客户端套接字的AE_WRITABLE事件与命令回复处理器的关联。