第 1 章 · Redis 是什么 & 为什么这么快

三个交互演示:① 阻塞 IO vs IO 多路复用 · ② epoll 事件循环 · ③ RESP 协议解析

同时来 5 个客户端,看看两种模型怎么处理

每个客户端代表一个 Redis 连接。命令的处理时间不一样(有快有慢)。点「开始」对比两种模型的吞吐:

速度:

❌ 阻塞 IO(一个连接死等到底)

已完成:0 / 5 用时:0 ms

✅ IO 多路复用(epoll,一个线程管所有连接)

已完成:0 / 5 用时:0 ms
看出来差距了吗? 阻塞 IO 必须按顺序处理,前一个不结束后面全饿死;IO 多路复用看到哪个 socket 「就绪」就处理哪个,整体吞吐高得多。
Redis 主线程就是用 epoll 实现的事件循环,单线程也能撑数万并发连接。

Redis 主线程的事件循环:epoll_wait → 派发 → 回到 epoll_wait

左边是「已注册的所有 socket」,中间是事件循环本身,右边是「当前轮就绪的事件」。点「下一步」单步看完整循环:

📂 已注册的 FD(红黑树)

主线程事件循环
点击「下一步」开始
while (true) { ... }

⚡ 就绪事件队列

关键点:注册一次 FD(epoll_ctl),之后内核会主动把就绪事件推到队列里; epoll_wait 一旦返回就直接拿到「哪些 FD 可读 / 可写」,无需像 select 那样轮询全量 FD。这就是 epoll 复杂度从 O(N) 降到 O(1) 的关键。

RESP 协议解析器:输入命令,逐字节看协议长什么样

修改下面的输入框(多个参数用空格隔开),实时看到对应的 RESP 字节流和解析结构:

① RESP 编码(高亮版)

数组 *N Bulk $L 字符串 长度数字 \r\n 分隔符

② 解析后的结构

动手练习:打开终端执行 printf '$(看左侧字节流)' | nc 127.0.0.1 6379, 就能不依赖任何客户端库,用 RESP 直接和 Redis 对话!