Appearance
缓存问题
缓存穿透
问题
查询一个不存在的数据,缓存没有,数据库也没有,每次都直接打DB。
解决
布隆过滤器
布隆过滤器判断key是否存在 存在才查缓存/数据库空值缓存
查询结果为空,缓存一个空值 设置短TTL(如1分钟)参数校验
过滤非法参数
缓存击穿
问题
热点key过期瞬间,大量请求直接打DB。
解决
互斥锁
只允许一个线程重建缓存 其他线程等待不过期
不设置TTL,定期异步更新逻辑过期
设置过期时间戳 发现过期,返回旧数据,同时异步更新
缓存雪崩
问题
大量key同时过期,请求直接打DB。
解决
随机TTL
过期时间 = base + random(0, 3600)多级缓存
本地缓存 + Redis缓存高可用
Redis Cluster
面试考点
Q: 三者区别?
| 问题 | 原因 | 解决 |
|---|---|---|
| 穿透 | 查询不存在的数据 | 布隆过滤器、空值缓存 |
| 击穿 | 热点key过期 | 互斥锁、不过期 |
| 雪崩 | 大量key同时过期 | 随机TTL、多级缓存 |
