redis缓存穿透和雪崩

2020-02-18  本文已影响0人  爱读书的夏夏

缓存雪崩

定义

缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期,或者缓存宕机),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。

一般主站不会直接查库,而是调用第三方http、dubbo接口。这同样会对下游造成影响。

解决方案

事前:

缓存高可用,解决宕机导致雪崩
一般的缓存都是定时任务刷进去的,定时任务的执行时间间隔需小于缓存过期时间

事中:

请求限流,防止DB打挂或者下游系统被打挂

事后:

尽快恢复缓存:redis恢复加载持久化数据、执行定时任务恢复热点数据

缓存穿透

定义

正常情况下,我们去查询数据都是存在。那么请求去查询一条压根儿数据库中根本就不存在的数据,也就是缓存和数据库都查询不到这条数据,但是请求每次都会打到数据库上面去。这种查询不存在数据的现象我们称为缓存穿透。

解决方案

缓存空值

在数据库中查不到时,先缓存空值,但是过期时间可以设置的稍微短一些。及时更新。

BloomFilter

可以在查询缓存前取BloomFilter查询key是否存在,如果不存在直接返回,存在再去查找缓存→DB (单机guava BloomFilter,分布式使用redis bitmap实现BloomFilter)

上一篇下一篇

猜你喜欢

热点阅读