缓存击穿、缓存穿透和缓存雪崩及对应解决方案

我们都知道,如果数据库压力大的话,可以考虑加Redis等做缓存。但是并不是说加了缓存就没问题,我们还需要考虑增加缓存后,会引入什么风险。常见的问题包括缓存击穿、缓存穿透和缓存雪崩等。

缓存击穿:缓存中没有(某热点key刚好失效),数据库中有。可以简单理解为某一热点key刚好到失效时间,一失效后导致访问这一热点key的请求在缓存中匹配不到,大量请求直接访问到数据库,导致数据库压力剧增。

缓存穿透:缓存中没有,数据库中没有。请求访问在缓存和数据库中都不存在的数据,导致请求频繁访问数据库。一旦这种请求数量达到一定规模,很可能就直接压垮数据库。比较直接的例子就是,黑客恶意攻击,就会用不会存在的数据例如用户id为-1发起大量请求,缓存中不会存在这种数据,数据库也没有这种数据,所以这些大量异常的请求就会穿过缓存,直接查询数据库,可能导致数据库处理不过来崩溃。

缓存雪崩:缓存中没有(大批量缓存同时失效),数据库中有。大量缓存key在同一时间内失效,导致大量请求直接打到数据库。

解决方案如下:

缓存击穿:(1)设置热点key永不失效(2)增加互斥锁,当某一热点key失效时,进来的请求只允许第一条进来的请求进程查询数据库,其他等待。第一条进程获取到数据后,对该数据进行缓存

缓存穿透:(1)对缓存和数据中都不存在的值,直接缓存该值等于null,并设置合适的缓存有效时间(2)接口层做校验,例如对id<=0等异常请求直接拦截(3)布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap 中,一个一定不存在的数据会被这个 bitmap拦截掉

缓存雪崩:(1)缓存过期时间设置成随机值(2)增加互斥锁

 

posted on 2021-11-11 17:46  标配的小号  阅读(165)  评论(0编辑  收藏  举报

导航