面试题答案
一键面试检测与接收
- 事件驱动模型:Redis基于事件驱动的I/O多路复用模型,使用epoll(Linux)、kqueue(FreeBSD)等多路复用器。当新的客户端连接请求到达时,多路复用器会检测到连接套接字上的可读事件。
- 监听套接字:Redis服务器启动时,会创建一个监听套接字(
server.ipfd
数组保存监听套接字),绑定到指定的IP地址和端口,等待客户端连接。 aeApiPoll
函数:多路复用器的具体实现函数(如aeApiPoll
),在被aeProcessEvents
调用时,会阻塞等待事件发生,当有新连接事件时,它会返回包含新连接事件的文件描述符集合。
后续处理
acceptTcpHandler
函数:当检测到新连接事件,Redis会调用acceptTcpHandler
函数。这个函数通过accept
系统调用从监听套接字接受新的客户端连接,创建一个新的客户端套接字。createClient
函数:acceptTcpHandler
函数接着调用createClient
函数,为新连接的客户端创建一个client
结构体实例。client
结构体:这是Redis中用于表示客户端的数据结构,包含客户端的套接字描述符、当前状态、输入输出缓冲区等信息。新创建的client
实例会被添加到服务器状态结构(server.clients
链表)中。- 命令处理准备:新客户端连接成功后,进入读取命令请求阶段,Redis通过
readQueryFromClient
函数从客户端套接字读取命令数据到输入缓冲区,后续由命令执行器根据缓冲区内容执行相应命令。