Appearance
缓存雪崩、穿透、击穿
1. 缓存雪崩
1.1. 什么是缓存雪崩
缓存雪崩指的是在同一时刻,缓存大量失效,导致大量的请求直接到了数据库,数据库压力剧增,引起系统崩溃。可能出现的情况有:
- 大量的 key 设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时 DB 请求量大、压力骤增,引起雪崩;
- 缓存系统出现故障,造成缓存系统无法提供服务,造成瞬时 DB 请求量大、压力骤增,引起雪崩;
1.2. 怎么避免缓存雪崩
事前:
- 在设置 key 的过期时间时,在过期时间上加上一个随机值,防止大量 key 同时过期;
- 搭建高可用的缓存架构,比如使用哨兵 + 主从结构或者使用 cluster 模式,避免缓存系统出现故障;
- 可以在系统中使用本地 cache 做个小缓存,防止 Redis 崩掉之后,还有一部分缓存;
事中:
- 赶快使用 Redis 持久化的数据,快速恢复缓存数据;
- 对系统请求进行降级和限流,防止数据库之间崩掉;
2. 缓存穿透
2.1. 什么是缓存穿透
缓存穿透是指有请求访问到了并不存在的数据,这样请求就会直接到达数据库,数据库就会压力剧增。
2.2. 怎么避免缓存穿透
- 可以使用一个足够大的 bitmap,将可能存在的 key 放到里面,请求过来先检查 bitmap 里面有么有,如果没有直接过滤掉这个请求;
- 将数据库查询出来的空值也放到缓存里面去,是这个 key 对应一个空值,只是这个 key 设置的时间比较短;
3. 缓存击穿
3.1. 什么是缓存击穿
一个存在的 key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到数据库,造成数据库请压力骤增。
3.2. 怎么避免缓存击穿
在访问 key 之前,采用 SETNX(set if not exists)来设置另一个短期 key 来锁住当前 key 的访问,访问结束再删除该短期 key。