外观
一句话答案
纯内存操作 + IO 多路复用(epoll)+ 单线程避免上下文切换和锁竞争 + 高效数据结构。
核心要点
Redis 快的六大原因:
1. 纯内存操作
- 所有数据存在内存,读写不需要磁盘 IO(内存访问约 100ns,磁盘随机访问约 10ms,差 5 个数量级)
2. 单线程模型(命令执行单线程)
- 没有线程竞争,不需要加锁/解锁,无上下文切换开销
- 避免了多线程并发写数据结构时的同步问题
3. IO 多路复用(非阻塞 IO)
- 单线程同时监听大量客户端连接(epoll)
- IO 就绪才处理,不因等待 IO 而阻塞
- 一个线程处理数万并发连接
4. 高效的数据结构
- SDS、ziplist、skiplist、hashtable 等都为内存和速度优化过
- 小数据量用紧凑编码(listpack),大数据量转复杂结构
5. 渐进式 rehash
- 避免一次性大规模内存重分配阻塞主线程
6. 通信协议简单(RESP 协议)
- 序列化/反序列化开销极小
Redis 的"单线程"到底指什么:
Redis 6.0 之前:完全单线程(命令执行 + IO 处理都在主线程)
Redis 6.0 之后:
主线程:命令执行(仍然单线程,保证原子性)
IO 线程(多线程):读写网络数据(解析请求/发送响应)
所以说"Redis 单线程"指的是命令执行是单线程,
IO 读写在 6.0 后已经是多线程Redis 是单线程但仍然需要并发安全的场景(如分布式锁):
- Redis 命令执行是单线程,保证了单个命令的原子性
- 但多个命令之间不是原子的(如先 GET 再 SET),其他客户端可能在中间插入命令
- 因此需要用
SETNX或 Lua 脚本将多个操作合并成一个原子操作
三、缓存问题
追问与易错
追问方向:
- Redis 6.0 多线程做了什么?
- 单线程缺点是什么?
- 为什么不用多线程?
易错点:
- ❌ 单线程就是只有一个线程——还有后台线程
- ❌ Redis 瓶颈在 CPU——通常在网络和内存
💡 记忆锚点
快的口诀"内IO线结构":纯内存(快5个数量级)、IO多路复用(一人管万线)、单线程(无锁无切换)、高效数据结构。6.0后IO读写多线程但命令执行仍单线程——厨师只有一个但服务员变多了。