🌹 Server

吞佛童子2022年10月10日
  • DB
  • Redis
大约 26 分钟

🌹 Server

源码地址open in new window

int main(int argc, char **argv) {
    // ...
    initServerConfig(); // 初始化 Server 配置
    // ...
    initServer(); // 初始化 Server
    // ...
    InitServerLast(); // Server 初始化的后置处理
    // ...
    aeMain(server.el); // 启动事件循环
    aeDeleteEventLoop(server.el); // 删除事件循环
}

1. Server 初始化

1) 初始化 Server 配置

  • populateCommandTable
    • 初始化命令表

2) 初始化 Server

  1. Server 相关参数初始化
  2. aeCreateEventLoop
    • 创建 事件循环机制
  3. listenToPort & anetUnixServer
    • 开启 (TCP | TLS) & Unix socket 监听
  4. aeCreateTimeEvent
    • 向事件循环中注册 timer 回调,执行 serverCron 函数,主线程执行
  5. aeCreateFileEvent
    • 注册 (TCP | TLS) & Unix & module pipe 的 IO 事件回调
  6. 其他初始化操作
    • 例如 集群初始化

3) Server 初始化的后置处理

  • bioInit
    • 初始化后台线程,创建线程执行 异步任务
    • 例:AOF fsync 刷盘,lazyFree 等

源码


2. 启动事件循环

  1. aeEventLoop 提供了
    • 创建 事件循环机制
    • 注册 timer 事件
    • 注册 file 事件
    • 启动 事件循环机制
  2. aeEventLoop 中通过调用具体的 多路复用方法实现多种 IO 多路复用,满足不同操作系统的要求
    • select
    • epoll
      • Linux 系统独有,优先使用
    • kqueue
      • macOS 系统,优先使用,类似于 epoll 机制
    • evport
      • illumos 系统,优先使用

3. 接收请求 & 返回响应


4. 处理命令

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou