1.*Redis为什么快?

Redis 之所以能达到 10 万+ QPS 的高性能,主要归功于以下 3 点(核心关键词):

  1. 基于内存运行(In Memory):

    • 这是最根本原因。 Redis 的所有数据都存储在内存中,读写操作不需要进行磁盘 I/O(相比磁盘数据库快几个数量级)。
  2. 高效的数据结构(Optimization):

    • Redis 针对每种数据类型都设计了特定的底层结构,比如 SDS(O(1) 取长度)、跳表(O(logN) 排序)、哈希表(O(1) 读写),避免了低效操作。
  3. 单线程模型 + I/O 多路复用(Multiplexing):

    • I/O 多路复用 (epoll): 允许一个线程同时处理多个网络连接,非阻塞地监听事件,极大提升了网络吞吐量。

    • 单线程避免开销: 避免了多线程带来的上下文切换锁竞争以及死锁问题,CPU 的执行效率非常高。

一句话总结:内存存储奠定了速度基础,数据结构优化了操作效率,而I/O 多路复用解决了并发吞吐瓶颈。”

2.Redis哪些地方使用了多线程?

“Redis 的‘单线程’指的是‘接收命令 解析 执行 返回结果’这个核心流程是单线程的。但在特定场景下,Redis 早就引入了后台线程来处理耗时任务。”

具体分为两个阶段:

  1. 后台辅助任务(Redis 4.0 之前就有): Redis 会启动后台线程(BIO 线程)来处理那些“耗时且不需同步返回”的操作,避免阻塞主线程:

    • 关闭文件: 关闭大文件的 fd(bio_close_file)。

    • AOF 刷盘: AOF 日志写回磁盘(bio_aof_fsync)。

    • 惰性删除 (Lazy Free): 也就是 UNLINK 命令,异步释放大 Key 占用的内存(bio_lazy_free)。

  2. 网络 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 产生事件时,将这些事件放入一个队列中,由文件事件分派器串行地调用对应的处理器进行处理。”

核心实现原理(关键点):

  1. 多路复用 API 的封装(底层核心):

    • Redis 并没有直接绑定某一种系统调用,而是根据操作系统自动选择性能最高的方法。

    • Linux: 优先使用 epoll

    • macOS/FreeBSD: 使用 kqueue

    • Solaris: 使用 evport

    • Fallback: 如果以上都不支持,降级使用 select

    • Redis 为这些 API 定义了统一的接口(ae_epoll.c, ae_select.c 等),向上层屏蔽了系统差异。

  2. 单线程 Reactor 模式(架构设计):

    • 监听: I/O 多路复用程序会监听 Server Socket 和 Client Socket 的状态(读/写/异常)。

    • 入队: 一旦有事件产生(比如客户端发来命令,Socket 变为“可读”),它会将该 Socket 放入一个有序、同步的队列中。

    • 分派: 文件事件分派器(Dispatcher)从队列中取出 Socket,根据事件类型调用对应的事件处理器(Handler)。

  3. 事件处理器(业务逻辑):

    • 连接应答处理器 (acceptTcpHandler): 处理新连接(当 Server Socket 可读时)。

    • 命令请求处理器 (readQueryFromClient): 读取客户端发送的命令(当 Client Socket 可读时)。

    • 命令回复处理器 (sendReplyToClient): 向客户端返回结果(当 Client Socket 可写时)。

💡 为什么这么设计效率高? “这种设计使得 Redis 可以用单线程管理成千上万个并发连接,既避免了多线程带来的锁竞争上下文切换开销,又充分利用了操作系统内核(如 epoll)的高效事件通知机制。”

4.Redis的网络模型是怎样的?

“Redis 采用的是基于 I/O 多路复用技术单线程 Reactor 模式(Event Loop 模型)。它能够在一个线程内高效地处理成千上万个并发连接。”

核心架构包含 4 个核心组件(面试必背):

  1. 套接字 (Sockets):

    • 也就是客户端连接。当 Socket 发生操作(如连接、读、写)时,会产生对应的文件事件
  2. I/O 多路复用程序 (I/O Multiplexing Module):

    • 它是“守门员”。负责同时监听多个 Socket,一旦某个 Socket 有动作(变为可读或可写),就将其筛选出来。

    • 关键机制: 它会将所有产生事件的 Socket 压入一个有序队列中,然后发给分派器。

  3. 文件事件分派器 (File Event Dispatcher):

    • 它是“调度员”。从队列中取出 Socket,根据事件类型(读/写),调用对应的处理器。虽然是单线程,但因为它不需要等待 I/O(非阻塞),所以处理速度极快。
  4. 事件处理器 (Event Handlers):

    • 连接应答处理器: 处理客户端的新连接 (accept)。

    • 命令请求处理器: 读取并执行客户端发送的命令 (read)。

    • 命令回复处理器: 将结果返回给客户端 (write)。

总结流程: “整个过程是一个死循环:Redis 不断等待文件事件产生 多路复用程序将事件入队 分派器逐个调用处理器 处理器执行业务逻辑。这就是 Redis 高性能网络模型的核心。”