直接回答
Redis 的"单线程"指命令执行主流程由单个线程完成。它快的原因:①纯内存操作,纳秒级访问;②单线程无锁竞争、无上下文切换开销;③I/O 多路复用(epoll/kqueue)一个线程就能高效处理数万连接;④精心设计的数据结构(SDS、跳表、压缩列表等)针对缓存场景做了大量优化。
展开解析
逐条看:
- 内存是主因:大部分命令是 O(1)/O(log N) 的内存操作,单线程每秒已能处理十万级请求,瓶颈通常在网络带宽而非 CPU,多线程收益不大。
- 单线程反而省去成本:没有锁、没有竞态、没有线程切换,命令天然原子执行,这也是 Lua 脚本能当"事务"用的基础。
- 多路复用:基于事件驱动 + epoll,单线程监听成千上万个 socket,就绪了才处理,不为每个连接阻塞。
- 数据结构:每种类型在元素少时用紧凑编码省内存、提升 CPU 缓存命中率。
两个澄清,避免面试踩坑:
- Redis 并非"全单线程"——持久化(bgsave fork)、AOF 刷盘、大 key 的异步删除(UNLINK)都由后台线程做;6.0 起网络 I/O 读写支持多线程(io-threads),但命令执行仍是单线程,语义不变。
- 单线程的代价:一个慢命令(KEYS、大 key 的 HGETALL、SMEMBERS)会阻塞所有请求,这是生产事故的常见来源。