文章目录
- [第 7 课:Redis 为什么这么快?(原理 + 面试)](#第 7 课:Redis 为什么这么快?(原理 + 面试))
-
- [一、先给结论(面试 10 秒版)](#一、先给结论(面试 10 秒版))
- 二、第一层原因:数据在内存里(但这不是全部)
-
- [MySQL vs Redis 的根本差异](#MySQL vs Redis 的根本差异)
- 三、第二层原因:单线程模型(很多人第一反应会误解)
-
- [❓ Redis 为什么敢用单线程?](#❓ Redis 为什么敢用单线程?)
- [单线程在 Redis 里意味着什么?](#单线程在 Redis 里意味着什么?)
- 对比:多线程常见成本
- [⚠️ 重要澄清(很多人答错)](#⚠️ 重要澄清(很多人答错))
- [四、第三层原因:I/O 多路复用(这是核心)](#四、第三层原因:I/O 多路复用(这是核心))
-
- [Redis 怎么同时服务"成千上万连接"?](#Redis 怎么同时服务“成千上万连接”?)
- [用人话解释 I/O 多路复用](#用人话解释 I/O 多路复用)
- 为什么这点极其重要?
- 五、第四层原因:极致简单的数据结构
- 六、第五层原因:执行路径极短(这一点很少人讲)
-
- [MySQL 一次查询要做什么?](#MySQL 一次查询要做什么?)
- [Redis 一次命令要做什么?](#Redis 一次命令要做什么?)
- [七、为什么 Redis 单线程还能"扛住高并发"?](#七、为什么 Redis 单线程还能“扛住高并发”?)
- [八、Redis 为什么"有时也会慢"?(重要)](#八、Redis 为什么“有时也会慢”?(重要))
- 九、面试高频问答(直接背)
-
- [Q1:Redis 为什么这么快?](#Q1:Redis 为什么这么快?)
- [Q2:Redis 单线程为什么不会成为瓶颈?](#Q2:Redis 单线程为什么不会成为瓶颈?)
- [Q3:Redis 为什么不用多线程?](#Q3:Redis 为什么不用多线程?)
- [十、这一课你必须记住的 5 个关键词](#十、这一课你必须记住的 5 个关键词)
- [十一、到这里,你已经"完整掌握 Redis"了](#十一、到这里,你已经“完整掌握 Redis”了)
第 7 课:Redis 为什么这么快?(原理 + 面试)
目标:
- 面试时能把"为什么快"讲清楚
- 设计系统时知道 Redis 的优势和边界
一、先给结论(面试 10 秒版)
Redis 快,不是因为"内存"这么简单,而是 5 件事叠加的结果:
1️⃣ 内存读写
2️⃣ 单线程模型
3️⃣ 高效数据结构
4️⃣ 非阻塞 I/O(多路复用)
5️⃣ 简单直接的执行路径
记住:不是某一个点,而是"组合拳"。
二、第一层原因:数据在内存里(但这不是全部)
MySQL vs Redis 的根本差异
| 对比 | MySQL | Redis |
|---|---|---|
| 数据位置 | 磁盘(即使有缓存) | 内存 |
| 访问成本 | 高 | 极低 |
| 适合场景 | 强一致 | 高并发 |
👉 内存快 ≈ 100 倍以上
但这 只解释了"快的下限",不是 Redis 真正的天花板。
三、第二层原因:单线程模型(很多人第一反应会误解)
❓ Redis 为什么敢用单线程?
因为 Redis 把"慢的事"都避开了
单线程在 Redis 里意味着什么?
- 同一时刻只执行一个命令
- 没有锁
- 没有线程切换
- 不会死锁
👉 执行路径极短
对比:多线程常见成本
text
加锁
↓
线程切换
↓
上下文切换
↓
CPU cache 失效
Redis:
我一个都不要
⚠️ 重要澄清(很多人答错)
Redis 是:
"命令执行单线程"❌ 不是"整个程序只有一个线程"
(I/O、后台持久化是多线程的)
四、第三层原因:I/O 多路复用(这是核心)
Redis 怎么同时服务"成千上万连接"?
不是一个线程一个连接,而是:
一个线程,管理所有连接
用人话解释 I/O 多路复用
你可以把 Redis 想成:
一个高效的"接线员"
- 哪个连接有数据
- 立刻处理哪个
- 不阻塞、不等待
Linux 下用的技术:
- epoll(Linux)
- kqueue(BSD)
为什么这点极其重要?
因为:
Redis 快在"并发处理能力",不是单次操作
五、第四层原因:极致简单的数据结构
Redis 的数据结构不是"教科书结构",而是为工程优化过的。
举几个例子(只讲直觉)
String
- 就是简单的字符串
- O(1)
Hash
- 小数据用 压缩列表
- 大了才转成 Hash 表
List / Set / ZSet
- 都是为"常用操作"优化过
- 不是通用结构,是定制结构
👉 Redis 不追求通用,只追求快
六、第五层原因:执行路径极短(这一点很少人讲)
MySQL 一次查询要做什么?
text
SQL 解析
→ 优化器
→ 选择索引
→ 访问磁盘 / buffer
→ 行锁 / 表锁
→ 返回结果
Redis 一次命令要做什么?
text
解析命令
→ 查内存结构
→ 返回结果
👉 差距不是一点点
七、为什么 Redis 单线程还能"扛住高并发"?
一个关键事实
Redis 的瓶颈不是 CPU,而是网络
- 单次命令:微秒级
- 单核就能跑几十万 QPS
👉 多线程反而可能变慢
八、Redis 为什么"有时也会慢"?(重要)
知道为什么快,也要知道什么时候会慢。
常见慢的原因
1️⃣ 大 key(一个 key 太大)
2️⃣ 阻塞命令(如 keys *)
3️⃣ AOF 重写 / RDB
4️⃣ 网络带宽打满
👉 慢 ≠ Redis 不行,是用法不对
九、面试高频问答(直接背)
Q1:Redis 为什么这么快?
A:
Redis 快主要因为数据在内存、单线程无锁模型、I/O 多路复用、高效数据结构,以及极短的执行路径。
Q2:Redis 单线程为什么不会成为瓶颈?
A:
因为 Redis 的瓶颈在网络和 I/O,而不是 CPU,单线程避免了锁和上下文切换,反而更快。
Q3:Redis 为什么不用多线程?
A:
命令执行单线程可以保证原子性和简单性,多线程会引入锁竞争,得不偿失。
十、这一课你必须记住的 5 个关键词
text
内存
单线程
无锁
I/O 多路复用
执行路径短
👉 面试说这 5 个,80 分起步
十一、到这里,你已经"完整掌握 Redis"了
你现在已经具备:
- ✅ 会用 Redis
- ✅ 会写缓存
- ✅ 知道所有大坑
- ✅ 能排查线上问题
- ✅ 能讲清楚原理
已经是一个"能在项目里独立负责 Redis"的水平。