Redis专题(Redis 为什么是单线程的?)
Redis 事件循环与多路复用详解 (单线程的核心原理)
本文用通俗易懂的语言,结合类比与源码级要点,全面解析 Redis 的事件循环(Event Loop)与多路复用(Multiplexing)机制。
一、事件循环(Event Loop)
1. 什么是事件循环?
事件循环是 Redis 单线程 的核心调度器,负责持续地:
- 等待事件(阻塞等待 I/O)
- 获取事件(哪些 fd 可读/可写/异常)
- 处理事件(调用对应的回调函数)
- 继续循环
类比:前台接待员不断询问“哪个窗口需要服务”。
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/