主题
Redis 为什么这么快
一句话机制:数据全在内存、命令执行走单线程串行 + IO 多路复用事件循环,无锁竞争、无上下文切换;瓶颈在内存带宽与网络而非 CPU。
不变量(必须成立的约束)
- 核心命令执行是单线程串行的(含 6.0 之前完全单线程;6.0+ 仅「网络 IO / 协议解析」多线程,命令执行阶段仍单线程排队)。
- 纯内存 + 内部哈希表,读写查找 O(1)。
- Redis 的瓶颈通常是内存容量 / 网络带宽,不是 CPU;因此作者不靠单实例多线程,而靠多实例/集群利用多核。
- 单线程下「一个慢命令会阻塞整个实例」(如大 key 删除、O(N) 全量遍历)。
关键证据 / 例子
- 官方标称:读 ~110000/s、写 ~81000/s。
- 4.0 lazyfree:大 key 删除/过期释放交给后台线程(
unlink、flushall async、lazyfree-lazy-eviction),避免主线程卡顿。 - 6.0 IO 多线程:
io-threads N默认关闭;多线程只解协议解析与读写网络,执行命令依旧单线程。 - 采用 RESP 协议:简单、解析快、人类可读。
常见误解
- ❌「Redis 是单线程的」——不严谨。准确说法:命令执行单线程,但 Redis 进程本身多线程(AOF 刷盘、重写、lazyfree 都是后台线程)。
- ❌「单线程 = 性能差」——反了。单线程避免了多线程的上下文切换和锁竞争开销,是它快的重要原因之一。
- ❌「6.0 引入多线程是为了让命令并行」——错。6.0 多线程只为分摊高并发下的协议解析压力,命令仍串行执行(需保证 key/lua/事务的原子性)。
- ❌「单线程所以不能用多核」——可水平扩展:部署多个 Redis 实例/集群,而非在单实例内堆线程。
关联
- 来源:Redis常见面试题(Fcant 多源聚合)
- 相关:Redis技术栈总览、概念卡片:Redis数据结构与底层实现