REDIS事件处理系统,基于reactor模式开发。socket代表与客户端或其它服务器之间的连接。当socket可交互时,即产生相应的文件事件,服务器监听并处理这些事件,来完成相应操作。
多个事件会并发出现。I/O多路复用程序,将事件放到队列里,并以有序、同步、每次一个的方式,向事件分发器传送。事件分发器将事件交给对应的事件处理器以处理任务。
I/O多路复用
REDIS为不同的I/O多路复用函数库,实现了相同的API,底层实现可以是select、epoll、evport、kqueue,程序在编译时,选择性能最高的函数库。类似于java的接口与实现。
扩展:什么是I/O多路复用?
事件类型和处理器
redis包含两个事件类型:ae.h/AE_READABLE、ae.h/AE_WRITEABLE
客户端动作 | 事件 | 处理器 |
---|---|---|
connect | AE_READABLE(serverFd) | 连接应答处理器 |
write | AE_READABLE | 命令请求处理器 |
read | AE_WRITEABLE | 命令回复处理器 |
close | AE_READABLE | 命令请求处理器 |
连接应答处理器networking.c/acceptTcpHandler
监听:服务器启动时,建立监听套接字的AE_READABLE事件和连接应答处理器的绑定关系;
触发:当客户端连接到服务器监听套接字的时候,监听套接字产生AE_READABLE事件,触发连接应答处理器,执行客户端连接操作。
命令请求处理器networking.c/readQueryFromClient
监听:客户端连接时,连接应答处理器,建立客户端套接字的AE_READABLE事件和命令请求处理器的绑定关系;
触发:当客户端发送命令时,触发AE_READABLE事件,命令请求处理器执行命令读入和处理。
命令回复处理器networking.c/sendReplyToClient
监听:命令请求处理器执行完成后,将需要回复的消息存在客户端reply缓存内,并监听AE_WRITEABLE事件
触发:当客户端read时,命令回复处理器将reply缓存内的消息写入客户端socket。然后取消AE_WRITEABLE关联
参考
【1】《Redis 设计与实现》
【2】redis事件循环
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。