Redis专题(Redis 为什么是单线程的?)

Redis 事件循环与多路复用详解 (单线程的核心原理)

本文用通俗易懂的语言,结合类比与源码级要点,全面解析 Redis 的事件循环(Event Loop)与多路复用(Multiplexing)机制。


一、事件循环(Event Loop)

1. 什么是事件循环?

事件循环是 Redis 单线程 的核心调度器,负责持续地:

  1. 等待事件(阻塞等待 I/O)
  2. 获取事件(哪些 fd 可读/可写/异常)
  3. 处理事件(调用对应的回调函数)
  4. 继续循环

类比:前台接待员不断询问“哪个窗口需要服务”。

2. 事件类型

类型 触发条件 典型回调
文件事件 socket 可读/可写/异常 读取客户端命令、发送响应
时间事件 定时器到期 删除过期键、AOF 重写

二、多路复用(Multiplexing)

1. 概念

多路复用让 一个线程 同时监听 多个文件描述符(fd) 的 I/O 状态,从而高效处理大量并发连接。

2. 系统实现

操作系统 实现机制 特点
Linux epoll O(1) 时间复杂度,支持边缘/水平触发
macOS/BSD kqueue 类似 epoll
Windows select 性能较低,仅兼容

Redis 在 ae.c 中通过宏自动选择最优实现。

3. epoll 工作流程(简化)

epfd = epoll_create(1024);          // 创建 epoll 实例
epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev); // 注册 fd
while (1) {
    n = epoll_wait(epfd, events, MAX, timeout); // 等待事件
    for (i = 0; i < n; i++) handle(events[i]);   // 处理就绪 fd
}

Redis专题(Redis 为什么是单线程的?)
http://example.com/2025/07/18/Redis/RedisSummary01/
作者
JunCCore
发布于
2025年7月19日
许可协议
BY-JUNCCORE