学习 Redis,可以从一个商品详情缓存开始:选什么结构保存,为什么访问快,数据什么时候失效,数据库更新后怎么办,实例重启或切主会怎样,热点与并发写入又如何处理。这些问题构成同一条业务链,比逐篇背诵术语更容易形成全局认识。
这篇导读面向后端校招和常规初级开发。先掌握基础主线,再根据追问和项目场景选读。 本系列也收录了底层实现与故障处理专题,它们的重要性与岗位有关,不能全部视为每场面试都要回答的题目。下面的优先级是学习建议,不代表实际题频统计。
先在脑中建立这张地图
Redis:用内存中的共享数据,支持低延迟访问与业务协调├─ 存什么、为什么快│ ├─ String / Hash / List / Set / ZSet → 根据访问方式选类型│ └─ 内存、事件循环与 I/O 多路复用 → 理解吞吐和阻塞边界├─ 内存有限,数据有生命周期│ ├─ TTL、惰性删除、主动过期 → 失效后如何清理│ └─ maxmemory、淘汰策略 → 容量不足时牺牲哪些数据├─ Redis 和数据库一起工作│ ├─ Cache Aside、一致性补偿 → 写入后避免长期读旧值│ └─ 穿透 / 击穿 / 雪崩、HotKey / BigKey → 控制回源和热点├─ 重启与故障后还能否使用│ ├─ RDB / AOF → 本节点的数据恢复│ └─ 主从复制、Sentinel、Cluster → 接管服务与数据分片├─ 并发下怎么做组合操作│ ├─ 单命令、MULTI/EXEC、WATCH、Lua → 原子性边界│ └─ 分布式锁、续期、限流 → 业务场景的正确性└─ 变慢或内存上涨后怎么定位 ├─ SLOWLOG、延迟、SCAN、Pipeline → 诊断与调用优化 └─ 编码、SDS、rehash、碎片、COW → 解释现象的实现细节三组区别要贯穿整个系列:过期不等于淘汰,持久化不等于复制,原子执行不等于失败回滚。 回答问题时先说明目标,再讲机制,最后交代机制保证不到的部分。
第一轮:按这十个问题读
每站先读主入口,能够口头回答掌握标准,再进入下一站。不要求一开始读完后面所有深化文章。
| 顺序 | 主入口 | 读完要能回答 |
|---|---|---|
| 1 | 数据类型 | 商品对象、计数器、排行榜分别为什么选 Hash、String、ZSet? |
| 2 | 为什么快 | 内存、多路复用和串行命令执行分别起什么作用?为什么长命令仍会拖慢整个实例? |
| 3 | 过期删除 | Key 到期和物理释放有什么区别?为什么不为每个 Key 建定时器? |
| 4 | 内存淘汰 | allkeys 与 volatile 的范围有什么差别?TTL 为什么不能代替容量规划? |
| 5 | 穿透、击穿、雪崩 | 哪类请求冲击数据库?空值、布隆过滤器、互斥重建、随机 TTL 各解决什么? |
| 6 | 缓存与数据库一致性 | 为什么常用先更新数据库再删缓存?删除失败和并发回填怎样补偿? |
| 7 | 持久化总览 | RDB 与 AOF 保存什么?数据丢失、恢复速度与资源开销怎么取舍? |
| 8 | 主从复制 → Sentinel 与 Cluster | 复制、高可用和分片分别解决什么?副本读为什么可能落后? |
| 9 | 分布式锁 → Lua | 为什么要 SET NX 带过期、唯一标识和原子释放?为什么续期仍不等于绝对安全? |
| 10 | 事务 → BigKey | MULTI/EXEC 为什么没有传统回滚?大对象与热点访问为何是不同问题? |
事务文章是概念入口,第一轮还要记住:入队时的语法等错误可使事务无法执行;EXEC 中某条命令发生运行时错误,其他命令仍可能成功,之前的写入不会自动撤回。WATCH 检测被观察 Key 的修改后,可以让 EXEC 放弃执行,应用需按业务规则重试。不要用“命令连续执行”推导完整 ACID。
完整导航:按问题找文章
目录编号与页面的系列导航一致:导读是第 1 篇,后续专题按基础主干、追问深化、场景拓展排列。主线用于第一轮学习,完整目录用于按问题查阅。
基础主干:先建立可解释的业务模型
| 模块 | 文章入口 | 学习边界 |
|---|---|---|
| 数据与用途 | 2. 类型选择、3. 应用场景 | 能把业务访问模式与数据类型对应,基础命令按场景记 |
| 执行模型 | 4. 为什么快 | 分清单线程命令执行与同时管理多连接 |
| Key 生命周期 | 5. TTL 与删除命令、6. 过期策略、7. 淘汰策略 | 命令是使用入口,策略解释自动清理与容量行为 |
| 缓存正确性 | 8. 三类缓存故障、9. 数据库一致性 | 能画出并发时序,说明补偿与最终一致性 |
| 本节点恢复 | 10. 持久化总览 | 先比较方案,刷盘和重写细节放到下一层 |
| 多节点架构 | 11. 复制流程、12. 哨兵、13. Sentinel 与 Cluster | 会区分副本、自动切主与分片,不必先背全部选举细节 |
| 并发控制 | 14. 事务、15. 锁、16. Lua | 能说明操作原子性、锁租约和失败回滚的边界 |
| 常见性能风险 | 17. HotKey、18. BigKey | 热点是访问集中,大对象是操作与内存规模大 |
常见追问:主干能答清楚后再展开
| 从哪个基础题展开 | 深化文章 | 需要进一步理解什么 |
|---|---|---|
| 为什么快、单线程 | 19. 单线程与 I/O 多线程 | Redis 6/7 常见线程分工,不重复背两篇相似概述 |
| 淘汰策略 | 20. LRU 与 LFU | 采样、频率衰减和访问模式取舍 |
| 数据类型 | 21. 内部编码、22. 跳表原理、23. ZSet 与平衡树比较 | 小对象紧凑编码、字典与跳表的互补;跳表两篇先原理后比较 |
| 持久化 | 24. RDB 与 COW、25. AOF 刷盘与重写 | fork 暂停、额外内存、刷盘可靠性与文件重写 |
| 主从复制 | 26. PSYNC 部分同步、27. 切主丢失与 WAIT | backlog 与复制历史;确认写入不等于零丢失 |
| 高可用与锁 | 28. 脑裂、29. Redisson 看门狗 | 网络分区和租约续期的剩余风险 |
| 分片与查询性能 | 30. Cluster 总览、31. Pipeline、32. SCAN 与 KEYS | 槽位路由、减少往返、增量扫描保证;不是三个同等目的的优化 |
| 实例变慢 | 33. SLOWLOG 与延迟排查 | 区分命令执行耗时与客户端端到端等待 |
场景与实现拓展:按岗位和项目选读
| 场景 | 文章入口 | 为什么可以后读 |
|---|---|---|
| 理解存储分工 | 34. Redis 与 MySQL 对比 | 辅助建立概念,已能清楚区分用途时可略读 |
| Redis 内部实现 | 35. SDS、36. 渐进式 rehash | 实现、存储和性能岗位更重视;一般后端先懂机制与成本,不先背源码常量 |
| 集群迁移与多 Key 设计 | 37. MOVED 与 ASK、38. CROSSSLOT 与 Hash Tag | 使用 Cluster 或排查迁移时重点看,单实例项目优先级较低 |
| 接口流量控制 | 39. 限流窗口与令牌桶 | 项目用到限流、网关或分布式设计时升级为重点 |
| Redis 作为消息通道 | 40. Stream 消费与 ACK | 使用 Stream 时必须理解 PEL 与幂等;不是所有后端岗位都需要专项准备 |
| 内存与线上容量治理 | 41. RSS 与内存碎片 | 遇到容量、持久化峰值或运维问题时深入,不必第一轮记所有指标 |
怎样确认已经形成体系?
试着不看文章描述一个商品缓存:用什么类型存,读取未命中如何回源,更新时如何删缓存,热点过期如何重建,Redis 不可用如何降级,重启与切主各可能丢什么。能够把这些环节串起来,再解释一个关键并发时序,就比背完目录更有价值。
Key 没有 TTL,是否一定不会消失? 不一定,allkeys 淘汰、主动删除和故障数据丢失都可能影响它,TTL 只是一类生命周期条件。
主节点 AOF 刷盘成功,副本接管就一定保留写入吗? 不一定,副本可能尚未收到;本节点持久化与多节点复制是不同保证。
Lua 原子执行,出错会不会回滚之前的修改? 不会自动按数据库事务回滚。原子执行强调不被普通命令穿插,错误处理与业务幂等仍需设计。
后续复习先选择自己解释不清的分支,再跳到对应专题。能回答主问题但没做过某个高级场景时,明确掌握边界即可,不需要把整个系列一次读完。