缓存击穿与互斥锁
面试官问:"什么是缓存击穿?和穿透有什么区别?"
小陈说:"击穿就是击穿...穿透就是穿透...?"
面试官追问:"如果热点 key 过期了,大量请求同时涌入数据库,怎么解决?"
小陈说:"...加锁?"
面试官继续追问:"Redis 的 setnx 怎么用的?"
小陈答不上来。
缓存击穿是 Redis 面试中的高频问题。这道题能说清楚击穿原因和互斥锁实现的候选人,对 Redis 的并发控制有实战理解。
一、缓存击穿 vs 穿透 vs 雪崩 🔴
1.1 三种问题的对比
1.2 缓存击穿的过程
1.3 ❌ 错误示范
候选人原话:"击穿和穿透是一样的,都是缓存没命中。"
问题诊断:完全不同。穿透查的是不存在的数据,永远不会命中缓存;击穿查的是存在的数据,只是 key 过期了。
【面试官心理】 这道题我会从"热点 key 过期"这个关键词追问。能区分击穿和雪崩(一个是单个 key,一个是多个 key 同时过期)的候选人,说明他对缓存问题有系统理解。
二、互斥锁方案 🔴
2.1 setnx 原理
2.2 代码实现
2.3 setnx 的原子性
三、其他解决方案 🟡
3.1 逻辑过期(永不过期)
3.2 两种方案对比
【面试官心理】 互斥锁是解决缓存击穿的最简单方案。能说清楚 setnx 的实现和 Lua 脚本释放锁的候选人,说明他对 Redis 的并发安全有实战理解。