Redis是单线程吗?真相远不止你想那样!

Redis 是单线程吗?这是一个非常经典的面试高频题,也是很多资深开发者的“重灾区”@mikechen

Redis是单线程吗?

很多人一提起 Redis,第一反应就是“Redis 是单线程的”,这没错,但也只对了一半。

Redis是单线程吗?真相远不止你想那样!-mikechen

真相是:Redis 的核心命令执行一直是单线程的,但从 Redis 6.0 开始,它已经不是“纯单线程”了。

它引入了多线程 IO,让整体性能在多核机器上大幅提升。

 

Redis单线程

Redis 的“命令执行模型”是单线程,但整体架构是多线程协作的。

Redis是单线程吗?真相远不止你想那样!-mikechen

所有客户端发来的 Redis 命令(SET、GET、HSET、ZADD、EVAL、MULTI/EXEC 事务、Lua 脚本等),都只能在一个主线程里串行执行。

为什么设计成单线程?(这才是 Redis 快的核心原因)没有锁竞争、没有上下文切换开销。

内存操作极快(纯内存 + SDS + ziplist/skiplist 等高效结构);

代码逻辑极简,可预测性强,容易 debug;

单线程 + IO 多路复用(epoll/kqueue/select)就能轻松处理 10w+ QPS。

 

Redis多线程

然而,把 Redis 轻率地称为“单线程数据库”容易产生误解。

实际上,Redis 并非在所有方面都严格限制为单线程执行。

Redis 在若干关键环节采用了多线程或并行化机制以改善性能和可用性。

Redis是单线程吗?真相远不止你想那样!-mikechen

例如:后台异步持久化(RDB 快照与 AOF 重写)通过子进程执行;

集群和复制场景下网络 I/O 与数据传输可以并发进行;

从 Redis 6 起,引入了可选的 I/O 多线程功能。

用于提升网络读写的并发能力,尤其在高并发连接场景下明显改善吞吐。

评论交流
    说说你的看法