缓存场景

官官方信息技术老师·8 页·深入(追求细节与边界)·0 次浏览·33 天前
信息技术大学

缓存场景

计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)

按 空格/→ 演示下一步

问一句
1 / 8 页

全部页面点击任意一页,跳回舞台从这页播放

信息技术大学

缓存场景

计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)

1第 1 页 · 缓存场景

缓存穿透/击穿/雪崩

三种典型的缓存失效攻击面:穿透查没有,击穿打热点,雪崩一起倒。

穿透
查不存在的 key,缓存永不命中,全打到数据库
击穿
热点 key 过期瞬间,并发请求直冲数据库
雪崩
大批 key 同时过期或缓存宕机,数据库被冲垮
对策
空值缓存、互斥重建、过期时间加随机
2第 2 页 · 缓存穿透/击穿/雪崩

缓存问题自测

点击作答

恶意请求大量不存在的 id,缓存形同虚设,这是哪种问题?

3第 3 页 · 缓存问题自测

缓存与数据库一致性

双写必有先后:先更库再删缓存,配合过期时间兜底,是实用的折中。

Cache Aside
读先缓存后库;写先更新库再删缓存
为何删不更
删除避免并发写覆盖,下次读自然回填
延迟双删
删后稍等再删一次,清掉并发窗口的脏缓存
兜底
任何方案都有窗口,过期时间是最后防线
4第 4 页 · 缓存与数据库一致性

分布式锁实现

跨进程抢同一把锁:Redis setnx 加过期最常用,正确姿势要看清三个坑。

加锁
SET key value NX EX ttl,一条命令原子完成
防误删
value 存请求标识,释放前校验是不是自己的锁
续期
业务没跑完锁先过期,看门狗自动续期
RedLock
多节点过半加锁的争议方案,慎用
5第 5 页 · 分布式锁实现

布隆过滤器

「一定没有」与「可能有」:位数组加多哈希,以微量误判换海量查询拦截。

原理
多哈希函数置位,说没有就一定没有
误判
说可能是哈希碰撞,误判率可按位调低
不可删
标准布隆不支持删除,计数变体才支持
场景
穿透拦截、消息去重、爬虫 URL 判重
6第 6 页 · 布隆过滤器

本节要点

  • ✓穿透查没有,击穿打热点,雪崩齐倒
  • ✓先更库再删缓存,过期时间兜底
  • ✓分布式锁:NX+过期+标识+续期
  • ✓布隆说没有就一定没有
延伸主题:给接口加布隆拦截复查缓存过期策略
7第 7 页 · 本节要点

课后思考

先自己回答,再展开参考答案——能讲出来才算真懂。

1为什么是「更新数据库后删除缓存」,而不是「更新缓存」?

参考答案并发写时更新缓存的先后不可控,后写的可能覆盖新值;删除是幂等且语义简单的失效动作,谁后执行都不冲突,下一次读再回填最新值。

2分布式锁的过期时间设多长合适?

参考答案本质是权衡:太短业务没跑完锁先失效,互斥被破坏;太长持有者崩溃后全员干等。标准解法是看门狗续期——锁只设短 TTL,持有者健康时自动延长。

3布隆过滤器误判了怎么办,会造成错误结果吗?

参考答案误判只有「可能有」一个方向:把不存在的判成存在,放过的请求由数据库兜底查一次返回空;它不会把存在的判成不存在,数据正确性不受影响。

8第 8 页 · 课后思考