信息技术大学
缓存场景
计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
信息技术大学
缓存场景
计算机基础面试八股 · 第 3 章 数据库(MySQL 与 Redis)
缓存穿透/击穿/雪崩
三种典型的缓存失效攻击面:穿透查没有,击穿打热点,雪崩一起倒。
穿透
查不存在的 key,缓存永不命中,全打到数据库
击穿
热点 key 过期瞬间,并发请求直冲数据库
雪崩
大批 key 同时过期或缓存宕机,数据库被冲垮
对策
空值缓存、互斥重建、过期时间加随机
缓存问题自测
点击作答
恶意请求大量不存在的 id,缓存形同虚设,这是哪种问题?
缓存与数据库一致性
双写必有先后:先更库再删缓存,配合过期时间兜底,是实用的折中。
Cache Aside
读先缓存后库;写先更新库再删缓存
为何删不更
删除避免并发写覆盖,下次读自然回填
延迟双删
删后稍等再删一次,清掉并发窗口的脏缓存
兜底
任何方案都有窗口,过期时间是最后防线
分布式锁实现
跨进程抢同一把锁:Redis setnx 加过期最常用,正确姿势要看清三个坑。
加锁
SET key value NX EX ttl,一条命令原子完成
防误删
value 存请求标识,释放前校验是不是自己的锁
续期
业务没跑完锁先过期,看门狗自动续期
RedLock
多节点过半加锁的争议方案,慎用
布隆过滤器
「一定没有」与「可能有」:位数组加多哈希,以微量误判换海量查询拦截。
原理
多哈希函数置位,说没有就一定没有
误判
说可能是哈希碰撞,误判率可按位调低
不可删
标准布隆不支持删除,计数变体才支持
场景
穿透拦截、消息去重、爬虫 URL 判重
本节要点
- ✓穿透查没有,击穿打热点,雪崩齐倒
- ✓先更库再删缓存,过期时间兜底
- ✓分布式锁:NX+过期+标识+续期
- ✓布隆说没有就一定没有
延伸主题:给接口加布隆拦截复查缓存过期策略
课后思考
先自己回答,再展开参考答案——能讲出来才算真懂。
1为什么是「更新数据库后删除缓存」,而不是「更新缓存」?
参考答案并发写时更新缓存的先后不可控,后写的可能覆盖新值;删除是幂等且语义简单的失效动作,谁后执行都不冲突,下一次读再回填最新值。
2分布式锁的过期时间设多长合适?
参考答案本质是权衡:太短业务没跑完锁先失效,互斥被破坏;太长持有者崩溃后全员干等。标准解法是看门狗续期——锁只设短 TTL,持有者健康时自动延长。
3布隆过滤器误判了怎么办,会造成错误结果吗?
参考答案误判只有「可能有」一个方向:把不存在的判成存在,放过的请求由数据库兜底查一次返回空;它不会把存在的判成不存在,数据正确性不受影响。