【每日八股】复习 Redis Day4:线程模型

发布于:2025-05-01 ⋅ 阅读:(22) ⋅ 点赞:(0)


上一篇 Redis 的应用我今天才完成,因此明天一并复习 Redis 的应用和线程模型,今天我们直接学习 Redis 线程模型。

复习 Redis Day4:线程模型

在这里插入图片描述

介绍一下 Redis 的线程模型

Redis 的线程模式是其高性能的核心设计之一,其核心思想是「单线程处理命令 + 多线程辅助执行特定任务」。在 Redis 6.0 之前,单线程是 Redis 的核心线程模型,在 Redis 6.0 之后引入了多线程进行辅助。

核心线程模型(Redis 6.0 之前)

1. 单线程处理所有命令
主线程职责

  • 接收客户端请求(网络 I/O);
  • 解析命令、执行数据操作(如读写内存);
  • 返回响应结果。

单线程优势

  • 避免锁竞争:无需处理多线程并发问题;
  • 顺序执行:所有命令顺序执行,天然避免竞态条件;
  • 高效内存访问:单线程可充分利用 CPU 缓存局部性;

2. 多线程辅助任务

  • 后台持久化:RDB 快照与 AOF 重写启用子进程来完成;
  • 异步删除大 key:通过 UNLINK 命令(非阻塞删除)触发后台线程清理。

Redis 6.0+ 的多线程改进

Redis 6.0 引入了「多线程网络 I/O」,但命令执行仍然为单线程,其核心改进如下:
1. 多线程网络 I/O

  • 主线程:负责监听和分发客户端连接请求
  • I/O 线程池:负责处理 socket 读写(解析请求和发送响应)。默认关闭,需要通过配置 io-threads N 启用。命令的执行仍然由主线程单线程处理,保证操作的原子性
  • 性能提升:高并发场景下,网络 I/O 多线程可显著提升吞吐量。

2. 典型工作流

  1. 主线程接收新的连接请求,将连接的 Socket 分发给 I/O 线程;
  2. I/O 线程读取请求并解析命令,将命令放入队列;
  3. 主线程从队列拉取命令,单线程执行并生成响应;
  4. I/O 线程将响应写回客户端。

Redis 真的是单线程吗?

这个问题我把它当作一个「子问题」放在 Redis 线程模型简述之下。Redis 在执行命令时确实是单线程,在 Redis 6.0 之后引入的多线程也只是为了并发地处理多路网络 I/O 请求,在执行命令时仍然是单线程。

Redis 的线程模型剖析

Redis 内部使用一个「文件事件处理器(File Event Handler)」,它是单线程的,所以 Redis 才被称作单线程模型。文件事件处理器采用 IO 多路复用机制监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件来选的对应的事件处理器进行处理。

文件事件处理器的结构如下:

  • 多个 socket;
  • IO 多路复用;
  • 文件事件分派器;
  • 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)。

网站公告

今日签到

点亮在社区的每一天
去签到