1.*Redis为什么快?
Redis 之所以能达到 10 万+ QPS 的高性能,主要归功于以下 3 点(核心关键词):
-
基于内存运行(In Memory):
- 这是最根本原因。 Redis 的所有数据都存储在内存中,读写操作不需要进行磁盘 I/O(相比磁盘数据库快几个数量级)。
-
高效的数据结构(Optimization):
- Redis 针对每种数据类型都设计了特定的底层结构,比如 SDS(O(1) 取长度)、跳表(O(logN) 排序)、哈希表(O(1) 读写),避免了低效操作。
-
单线程模型 + I/O 多路复用(Multiplexing):
-
I/O 多路复用 (epoll): 允许一个线程同时处理多个网络连接,非阻塞地监听事件,极大提升了网络吞吐量。
-
单线程避免开销: 避免了多线程带来的上下文切换、锁竞争以及死锁问题,CPU 的执行效率非常高。
-
一句话总结: “内存存储奠定了速度基础,数据结构优化了操作效率,而I/O 多路复用解决了并发吞吐瓶颈。”
2.Redis哪些地方使用了多线程?
“Redis 的‘单线程’指的是‘接收命令 → 解析 → 执行 → 返回结果’这个核心流程是单线程的。但在特定场景下,Redis 早就引入了后台线程来处理耗时任务。”

具体分为两个阶段:
-
后台辅助任务(Redis 4.0 之前就有): Redis 会启动后台线程(BIO 线程)来处理那些“耗时且不需同步返回”的操作,避免阻塞主线程:
-
关闭文件: 关闭大文件的 fd(
bio_close_file)。 -
AOF 刷盘: AOF 日志写回磁盘(
bio_aof_fsync)。 -
惰性删除 (Lazy Free): 也就是
UNLINK命令,异步释放大 Key 占用的内存(bio_lazy_free)。
-
-
网络 I/O 处理(Redis 6.0 新特性):
-
背景: 随着硬件发展,Redis 的瓶颈不再是 CPU,而是网络带宽和网络 I/O。
-
实现: Redis 6.0 引入了 I/O 多线程,专门用于并发地读取请求(Socket Read)和写回响应(Socket Write)。
-
注意(面试坑点): 即使开启了多线程 I/O,命令的执行仍然是由主线程串行完成的,所以依然不需要考虑线程安全锁的问题。
-
3.Redis怎么实现的io多路复用?

“Redis 利用Reactor 模式开发了自己的网络事件处理器。它通过I/O 多路复用程序同时监听多个 Socket,当 Socket 产生事件时,将这些事件放入一个队列中,由文件事件分派器串行地调用对应的处理器进行处理。”
核心实现原理(关键点):
-
多路复用 API 的封装(底层核心):
-
Redis 并没有直接绑定某一种系统调用,而是根据操作系统自动选择性能最高的方法。
-
Linux: 优先使用
epoll。 -
macOS/FreeBSD: 使用
kqueue。 -
Solaris: 使用
evport。 -
Fallback: 如果以上都不支持,降级使用
select。 -
Redis 为这些 API 定义了统一的接口(
ae_epoll.c,ae_select.c等),向上层屏蔽了系统差异。
-
-
单线程 Reactor 模式(架构设计):
-
监听: I/O 多路复用程序会监听 Server Socket 和 Client Socket 的状态(读/写/异常)。
-
入队: 一旦有事件产生(比如客户端发来命令,Socket 变为“可读”),它会将该 Socket 放入一个有序、同步的队列中。
-
分派: 文件事件分派器(Dispatcher)从队列中取出 Socket,根据事件类型调用对应的事件处理器(Handler)。
-
-
事件处理器(业务逻辑):
-
连接应答处理器 (
acceptTcpHandler): 处理新连接(当 Server Socket 可读时)。 -
命令请求处理器 (
readQueryFromClient): 读取客户端发送的命令(当 Client Socket 可读时)。 -
命令回复处理器 (
sendReplyToClient): 向客户端返回结果(当 Client Socket 可写时)。
-
💡 为什么这么设计效率高? “这种设计使得 Redis 可以用单线程管理成千上万个并发连接,既避免了多线程带来的锁竞争和上下文切换开销,又充分利用了操作系统内核(如 epoll)的高效事件通知机制。”
4.Redis的网络模型是怎样的?

“Redis 采用的是基于 I/O 多路复用技术 的 单线程 Reactor 模式(Event Loop 模型)。它能够在一个线程内高效地处理成千上万个并发连接。”
核心架构包含 4 个核心组件(面试必背):
-
套接字 (Sockets):
- 也就是客户端连接。当 Socket 发生操作(如连接、读、写)时,会产生对应的文件事件。
-
I/O 多路复用程序 (I/O Multiplexing Module):
-
它是“守门员”。负责同时监听多个 Socket,一旦某个 Socket 有动作(变为可读或可写),就将其筛选出来。
-
关键机制: 它会将所有产生事件的 Socket 压入一个有序队列中,然后发给分派器。
-
-
文件事件分派器 (File Event Dispatcher):
- 它是“调度员”。从队列中取出 Socket,根据事件类型(读/写),调用对应的处理器。虽然是单线程,但因为它不需要等待 I/O(非阻塞),所以处理速度极快。
-
事件处理器 (Event Handlers):
-
连接应答处理器: 处理客户端的新连接 (
accept)。 -
命令请求处理器: 读取并执行客户端发送的命令 (
read)。 -
命令回复处理器: 将结果返回给客户端 (
write)。
-
总结流程: “整个过程是一个死循环:Redis 不断等待文件事件产生 → 多路复用程序将事件入队 → 分派器逐个调用处理器 → 处理器执行业务逻辑。这就是 Redis 高性能网络模型的核心。”