缓存穿透、击穿,缓存雪崩

  • 缓存穿透:key对应的数据在数据库并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据库,从而可能压垮数据库。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

  • 缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

  • 缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。

击穿和穿透,意思差不多,都是找不到key,流量打到数据库上
雪崩是key大量国企失效,流量打到数据库上

解决方案

1. 缓存穿透、击穿的解决

这两个问题都是因为找不到key导致的,所以我们可以
(1)简单粗暴,当数据查询结果为空时,我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。这样下次再查询我们就可以找到并返回了
(2) 布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。

2. 缓存雪崩的解决

(1)缓存雪崩是由于缓存key失效导致的,所以将缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

(2)对数据库进行保护,考虑用加锁或者队列的方式,保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。