缓存雪崩
- 描述
- 大量的 key 设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时 DB 请求量大、压力骤增,引起雪崩。
- 解决方案
- 分级缓存
- 给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效。
缓存穿透
- 描述
- 访问一个不存在的 key 时,缓存不起作用,请求会穿透到 DB ,流量大时 DB 自然就会瘫痪。
- 解决方案
- 利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试。
- 即使查询到的数据为空,仍把该空值缓存,还需要设置过期时间。
- 布隆过滤器,内部维护一系列合法有效的 key 就可以迅速判断出请求所携带的key是否合法有效。如果不合法,则直接返回。
缓存击穿
- 描述
- 一个存在的 key,在缓存过期的一刻,恰好在这个时间点对这个 key 有大量的并发请求过来,这个时候大量的请求可能会瞬间瘫痪掉 DB 。
- 解决方案
- 分级缓存
- 互斥锁
缓存预热
- 描述
- 系统上线后,提前将数据刷到缓存。避免用户在访问的时候,先去查询数据库。
- 解决方案
- 数据量不大的时候,工程启动的时候进行加载缓存
- 数据量大的时候,设置一个定时任务脚本,进行缓存的刷新
- 数据量太大的时候,优先保证热点数据进行提前加载到缓存
缓存降级
缓存降级是指缓存失效或缓存服务器挂掉的情况下,不去访问数据库,直接返回默认数据或访问服务的内存数据