Skip to content
极高基础

一句话答案

纯内存操作 + 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读写多线程但命令执行仍单线程——厨师只有一个但服务员变多了。