雪崩、穿透、击穿的理解
# 缓存雪崩
意味着大面积(或全部)缓存失效,直接打到 DB
出现的原因和解决方案:
- Redis 的 key 同一刻过期失效:存数据时失效时间加个随机值
- Redis 服务故障:高可用处理,集群化,主从+哨兵
# 缓存穿透
意味着就没想走缓存,直接打到 DB 且数据是不存在的。
一般就是恶意请求带着特殊的 key 保证绕过缓存,不断查询空数据给 DB 造成压力
解决方案:
- (缓解):业务侧参数校验:增加一些明显的非法 key 的过滤
- (缓解):ip 限流
- 布隆过滤器:利用高效的数据结构和算法快速判断 Key 是否在数据库中存在。若判断 key 不存在则一定不存在,此处不做拓展
# 缓存击穿
单点的缓存雪崩
出现原因:热点 key 在某个时刻过期。由于一直在扛着大并发的请求,该热点 key 过期后直接打到数据库
解决方案:
- 永不过期:缓存不设过期时间,更新数据后直接更新缓存
- 互斥锁:热点 key 缓存数据过期后,先加锁,去数据库拿数据并写到缓存,再释放锁;其他该热点 key 的请求会等待锁释放,之后直接拿到新缓存。
# 拓展阅读
编辑 (opens new window)
上次更新: 2024/09/01, 23:56:56