MD 更新:未知

Redis 与缓存 · 考点总结

综合整理自: 05-缓存数据库(Redis)06-缓存与分布式系统 以及 llm-wiki 中的 缓存雪崩缓存穿透缓存击穿缓存预热CAPCache-Aside策略缓存与数据库协作AOFRDBRedis主从模式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 ⭐

对比项MemcacheRedis
数据类型简单 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-ttlttl值小的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 选择题高频

  1. Redis vs Memcache:Redis支持丰富的数据结构持久化
  2. 五大数据类型:String、Hash、List、Set、Sorted Set
  3. RDB vs AOF:RDB快但不安全,AOF慢但安全
  4. 缓存雪崩 vs 穿透 vs 击穿的区分
  5. 默认淘汰策略:noeviction
  6. CAP定理:三者不可兼得,分布式系统默认需要P

8.2 案例分析高频

  1. 识别缓存问题类型(雪崩/穿透/击穿)并给出解决方案
  2. Cache-Aside策略的读写流程
  3. 选择合适的Redis分布式方案(主从/哨兵/集群)
  4. CAP权衡分析
  5. 缓存与数据库的一致性问题

8.3 论文写作素材

  • Redis在大型网站中的应用实践
  • 缓存架构设计方案
  • 分布式缓存的一致性与可用性权衡

九、速记口诀

“Redis五类型,RDB快AOF安,雪崩穿透击穿三兄弟,主从哨兵集群三级跳,CAP不可兼得P必选”

  • 五类型 → String Hash List Set ZSet
  • RDB → 快照全量快恢复低安全
  • AOF → 日志增量慢恢复高安全
  • 雪崩 → 大量key同时失效
  • 穿透 → 查询不存在的数据
  • 击穿 → 热点key过期
  • 主从 → 手动切换
  • 哨兵 → 自动切换
  • 集群 → slots分片
  • CAP → C A P 不可兼得

相关笔记

学习路径