Redis 与缓存 · 考点总结
综合整理自: 05-缓存数据库(Redis)、06-缓存与分布式系统 以及 llm-wiki 中的 缓存雪崩、缓存穿透、缓存击穿、缓存预热、CAP、Cache-Aside策略、缓存与数据库协作、AOF、RDB、Redis主从模式、Redis哨兵模式、Redis Cluster
知识图谱
Redis 与缓存
├── 1. Redis 基础
│ ├── Redis vs Memcache
│ ├── 五大数据类型
│ └── 持久化(RDB / AOF)
├── 2. 缓存三大问题 ⭐⭐⭐
│ ├── 缓存雪崩(大量key同时失效)
│ ├── 缓存穿透(查询不存在的数据)
│ └── 缓存击穿(热点key过期)
├── 3. 缓存与数据库协作
│ ├── Cache-Aside 策略
│ ├── 读写流程
│ └── 缓存预热 / 缓存更新
├── 4. Redis 分布式方案 ⭐⭐
│ ├── 主从模式(一主多从,手动切换)
│ ├── 哨兵模式(自动故障转移)
│ └── 集群模式(slots分片)
├── 5. 分片策略
│ ├── 范围分片
│ ├── 哈希分片
│ └── 一致性哈希分片
├── 6. 淘汰机制
└── 7. CAP 定理 ⭐⭐
一、Redis 基础
1.1 Redis vs Memcache ⭐
| 对比项 | Memcache | Redis |
|---|---|---|
| 数据类型 | 简单 key-value | 丰富的数据结构 |
| 持久化 | 不支持 | 支持 |
| 分布式存储 | 客户端哈希分片/一致性哈希 | 多种方式,主从 |
| 多线程支持 | 支持 | Redis5.0及以前不支持 |
| 内存管理 | 私有内存池 | 无 |
| 事务支持 | 不支持 | 有限支持 |
| 容灾 | 不支持,不能数据恢复 | 支持,可恢复数据 |
记忆要点: Redis 功能更全面(数据类型丰富、支持持久化、支持容灾),Memcache 更简单轻量。
1.2 Redis 五大数据类型 ⭐
| 类型 | 特点 | 典型应用 |
|---|---|---|
| String | 二进制安全,最大512MB | 缓存、计数、共享Session |
| Hash | 无序字典,key对应HashMap | 存储/读取/修改用户属性 |
| List | 双向链表 | 消息队列、文章列表 |
| Set | 无序、唯一 | 独立IP统计、共同爱好、标签 |
| Sorted Set | 有序、唯一 | 排行榜 |
记忆口诀: “S H L S Z”(String、Hash、List、Set、ZSet)
1.3 持久化 ⭐⭐
Redis 两种持久化方式:
| 对比项 | RDB(快照) | AOF(日志追加) |
|---|---|---|
| 备份方式 | 全量备份 | 增量备份(只保存修改命令) |
| 保存间隔 | 长 | 短,默认1秒 |
| 还原速度 | 快 | 慢 |
| 堵塞情况 | save会堵塞,bgsave不会 | 不会 |
| 文件体积 | 小 | 大 |
| 安全性 | 低,容易丢数据 | 高,最多丢1秒数据 |
记忆要点:
- RDB = 快照 = 全量 = 快恢复 = 低安全
- AOF = 日志 = 增量 = 慢恢复 = 高安全
考试陷阱: RDB的save命令会堵塞,bgsave不会。这是常见考点。
二、缓存三大问题 ⭐⭐⭐
这是案例分析题的高频必考内容,必须准确区分。
2.1 三大问题对比
| 问题 | 核心原因 | 影响 | 解决方案 |
|---|---|---|---|
| 缓存雪崩 | 大量key同时失效 | 数据库被大量请求压垮 | ①加锁/队列 ②随机失效时间 ③二级缓存 |
| 缓存穿透 | 查询不存在的数据 | 每次请求都穿透到数据库 | ①布隆过滤器 ②缓存空值 |
| 缓存击穿 | 单个热点key过期 | 大量并发请求打到数据库 | ①热点永不过期 ②逻辑过期 ③互斥锁 |
2.2 详细解析
缓存雪崩
场景: 大量缓存键在同一时间失效 → 所有请求直接打到数据库 → 数据库崩溃
解决方案:
| 方案 | 说明 |
|---|---|
| 加锁/队列 | 控制并发,只允许一个线程查询数据库并更新缓存 |
| 随机失效时间 | 在固定缓存时间基础上 + 随机时间,避免同时失效 |
| 二级缓存 | 本地缓存 + Redis缓存,降低Redis失效影响 |
缓存穿透
场景: 查询不存在的数据 → 缓存和数据库都无法命中 → 每次请求都打到数据库
解决方案:
| 方案 | 说明 |
|---|---|
| 布隆过滤器 | 快速判断数据是否存在,不存在则直接返回 |
| 缓存空值 | 将不存在的数据也缓存为空值,设置较短过期时间 |
缓存击穿
场景: 某一热点数据key过期 → 大量并发请求在短时间内同时访问 → 绕过缓存直接打到数据库
解决方案:
| 方案 | 说明 |
|---|---|
| 热点永不过期 | 对极高频热点key不设置物理过期时间 |
| 逻辑过期 | 缓存值中保存逻辑过期时间,过期后先返回旧值,异步线程刷新缓存 |
| 互斥锁 | 只有一个线程回源查询数据库并重建缓存,其他线程等待或返回旧值 |
2.3 记忆技巧
缓存雪崩 = 大量key同时失效 → "雪崩"→ 一大片雪同时落下
缓存穿透 = 查询不存在的数据 → "穿透"→ 穿过缓存直达数据库
缓存击穿 = 单个热点key过期 → "击穿"→ 一个点被击穿
案例分析答题模板:
题目描述中出现:
- “大量缓存同时过期” → 缓存雪崩
- “查询不存在的数据” → 缓存穿透
- “热点数据过期、高并发” → 缓存击穿
三、缓存与数据库协作 ⭐⭐
3.1 Cache-Aside 策略
最常用的缓存读写协作模式,由应用层负责缓存和数据库的交互。
读流程:
1. 先查询缓存
2. 缓存命中 → 直接返回
3. 缓存未命中 → 查询数据库 → 将结果写入缓存 → 返回
写流程:
1. 先更新数据库
2. 再删除缓存(或更新缓存)
注意: 先更新数据库,再删除缓存。这是推荐的做法。
3.2 缓存预热
定义: 系统启动前,预先将热点数据加载到缓存中,避免启动后大量请求穿透到数据库。
实现方式:
- 系统启动时触发数据加载任务
- 定时任务提前加载热点数据
- 根据历史访问记录预测热点数据
3.3 缓存更新
- 定期清理过期缓存
- 判断请求是否过期,过期就到底层系统获取新数据并更新缓存
四、Redis 分布式方案 ⭐⭐
4.1 三种模式对比
| 方案 | 特点 | 故障切换 | 数据分片 |
|---|---|---|---|
| 主从模式 | 一主多从 | 手动切换 | 不支持 |
| 哨兵模式 | 主从 + 哨兵监控 | 自动切换 | 不支持 |
| 集群模式 | 多节点对等 | 自动切换 | 支持(slots) |
4.2 主从模式
- 一主多从的复制方案
- 主节点负责写入,从节点复制主节点数据
- 可分担读请求,提高读能力
- 局限: 主节点故障时需要手动切换
4.3 哨兵模式
- 在主从模式基础上引入 Sentinel 监控
- 核心能力: 监控主从节点、发现故障、自动切换主节点
- 适用场景:需要自动故障转移,但不一定需要数据分片扩展
4.4 集群模式(Redis Cluster)
- 通过 slots 将key空间切分到不同节点
- 客户端访问错误节点时,服务端返回重定向信息
- 由客户端和服务端协作完成分片路由
- 适用场景:需要横向扩展的大规模数据
4.5 记忆要点
主从模式 = 基础版(手动切换)
哨兵模式 = 主从 + 自动切换(高可用)
集群模式 = 主从 + 自动切换 + slots分片(高可用 + 高扩展)
五、分片策略 ⭐
| 分片方式 | 分片方式 | 说明 |
|---|---|---|
| 范围分片 | 按数据范围分片 | 例:按用户编号分片 |
| 哈希分片 | 对key进行hash运算分片 | 余数相同的数据在同一实例 |
| 一致性哈希分片 | 哈希分片的改进 | 解决节点增减时的无法命中问题 |
5.1 Redis集群切片方式
| 切片方式 | 特点 |
|---|---|
| 客户端切片 | 客户端通过key的hash值对应不同服务器 |
| 中间件切片 | 如Codis,中间件实现路由分配 |
| 客户端服务端协作分片 | Redis Cluster模式,服务端提供slot重定向 |
六、淘汰机制 ⭐
当Redis内存不足时的数据淘汰策略:
| 淘汰范围 | 机制名 | 策略 |
|---|---|---|
| 不淘汰 | noeviction | 禁止驱逐,内存不足时写入报错(系统默认) |
| 过时淘汰的键空间 | volatile-random | 随机移除某个key |
| volatile-lru | 优先移除近期未使用的key(局部性原理) | |
| volatile-ttl | ttl值小的key优先淘汰 | |
| 全键空间 | allkeys-random | 随机移除某个key |
| allkeys-lru | 优先移除近期未使用的key |
记忆要点:
- 默认策略:noeviction(不淘汰,写入报错)
- LRU = Least Recently Used(最近最少使用)
- volatile-开头 = 只淘汰有过期时间的key
- allkeys-开头 = 淘汰所有key
七、CAP 定理 ⭐⭐
7.1 三个维度
| 维度 | 含义 | 记忆 |
|---|---|---|
| C - Consistency | 所有节点看到的数据保持一致 | 数据一致 |
| A - Availability | 每次请求都能及时得到响应 | 随时可用 |
| P - Partition Tolerance | 网络可能断联/分区,但系统不能崩溃 | 分区容错 |
7.2 核心结论
- 分布式系统必须考虑网络分区,因此通常默认需要P
- 在出现网络分区时,系统需要在 C和A之间做权衡
- 三者不可兼得,最多只能同时满足两个
7.3 常见组合
| 组合 | 说明 | 示例 |
|---|---|---|
| CP | 一致性 + 分区容错(牺牲可用性) | ZooKeeper、HBase |
| AP | 可用性 + 分区容错(牺牲一致性) | Cassandra、DynamoDB |
| CA | 一致性 + 可用性(无分区容错) | 传统关系型数据库(理论上的) |
考试要点: 分布式系统通常选择CP或AP,CA在分布式环境中几乎不可能实现。
八、高频考点速记
8.1 选择题高频
- Redis vs Memcache:Redis支持丰富的数据结构和持久化
- 五大数据类型:String、Hash、List、Set、Sorted Set
- RDB vs AOF:RDB快但不安全,AOF慢但安全
- 缓存雪崩 vs 穿透 vs 击穿的区分
- 默认淘汰策略:noeviction
- CAP定理:三者不可兼得,分布式系统默认需要P
8.2 案例分析高频
- 识别缓存问题类型(雪崩/穿透/击穿)并给出解决方案
- Cache-Aside策略的读写流程
- 选择合适的Redis分布式方案(主从/哨兵/集群)
- CAP权衡分析
- 缓存与数据库的一致性问题
8.3 论文写作素材
- Redis在大型网站中的应用实践
- 缓存架构设计方案
- 分布式缓存的一致性与可用性权衡
九、速记口诀
“Redis五类型,RDB快AOF安,雪崩穿透击穿三兄弟,主从哨兵集群三级跳,CAP不可兼得P必选”
- 五类型 → String Hash List Set ZSet
- RDB → 快照全量快恢复低安全
- AOF → 日志增量慢恢复高安全
- 雪崩 → 大量key同时失效
- 穿透 → 查询不存在的数据
- 击穿 → 热点key过期
- 主从 → 手动切换
- 哨兵 → 自动切换
- 集群 → slots分片
- CAP → C A P 不可兼得