Redis 的线程模型是其高性能和高并发能力的关键因素之一。理解 Redis 的线程模型,有助于更好地使用 Redis 并进行性能优化。
在 Redis 6.0 之前,Redis 是单线程的,但这并不意味着整个 Redis 进程只有一个线程,而是指:
处理客户端请求命令(读取命令、执行命令)是在一个主线程中串行执行的。
INCR
、SETNX
等)。从 Redis 6.0 开始,Redis 引入了 I/O 多线程(multi-threaded I/O),但核心命令处理仍然是单线程的。
阶段 | 描述 |
---|---|
接收客户端连接 | 主线程负责监听并接收新连接 |
读取客户端请求 | 多个 I/O 线程并行读取数据 |
执行命令 | 主线程串行处理所有命令 |
响应写回客户端 | 多个 I/O 线程并行写回响应 |
在 redis.conf
中配置:
io-threads 4
io-threads-do-reads yes
io-threads
: 设置用于处理 I/O 的线程数(通常设置为 CPU 核心数)。io-threads-do-reads
: 是否开启多线程读取,默认关闭。虽然命令处理是单线程的,但 Redis 的持久化操作是通过子进程或后台线程完成的:
操作类型 | 实现方式 |
---|---|
RDB 快照 | fork 子进程完成,不会阻塞主线程(Copy-on-write 技术) |
AOF 写入 | 主线程写入缓冲区,由后台线程刷盘(AOF rewrite 使用子进程) |
Redis 7.0 进一步增强了多线程支持,引入了 任务多线程(threaded workers),可以将某些耗时命令异步执行。
例如:
FUNCTION LIST
, ACL LIST
等命令可以被卸载到后台线程执行。这使得 Redis 在保持接口简洁的同时,进一步提升高负载下的稳定性。
特性 | Redis < 6.0 | Redis 6.0+ | Redis 7.0+ |
---|---|---|---|
命令处理 | 单线程 | 单线程 | 单线程 + 可选多线程任务 |
网络 I/O | 单线程 | 多线程(读/写) | 多线程 |
持久化(RDB/AOF) | 子进程/后台线程 | 子进程/后台线程 | 子进程/后台线程 |
并发能力 | 依赖单核性能 | 多核并行 I/O | 多核并行 I/O + 异步任务 |
KEYS *
、大对象序列化等,避免阻塞主线程。INFO threads
查看线程相关信息。