缓存雪崩
定义
缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期,或者缓存宕机),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。
一般主站不会直接查库,而是调用第三方http、dubbo接口。这同样会对下游造成影响。
解决方案
事前:
缓存高可用,解决宕机导致雪崩
一般的缓存都是定时任务刷进去的,定时任务的执行时间间隔需小于缓存过期时间
事中:
请求限流,防止DB打挂或者下游系统被打挂
事后:
尽快恢复缓存:redis恢复加载持久化数据、执行定时任务恢复热点数据
缓存穿透
定义
正常情况下,我们去查询数据都是存在。那么请求去查询一条压根儿数据库中根本就不存在的数据,也就是缓存和数据库都查询不到这条数据,但是请求每次都会打到数据库上面去。这种查询不存在数据的现象我们称为缓存穿透。
解决方案
缓存空值
在数据库中查不到时,先缓存空值,但是过期时间可以设置的稍微短一些。及时更新。
BloomFilter
可以在查询缓存前取BloomFilter查询key是否存在,如果不存在直接返回,存在再去查找缓存→DB (单机guava BloomFilter,分布式使用redis bitmap实现BloomFilter)
网友评论