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

定义:

1:缓存穿透:

在redis中,key对应的值并不存在,每次去到redis缓存中查询数据都得不到结果,一般业务逻辑中就会去数据库查询,这种漏洞就可能会被人利用直接攻击数据库。例子:获取用户信息接口中,某人利用一个根本不存在的用户id进行大批量的请求,每一个请求都会到达数据库,就可能压垮数据库。

2:缓存击穿:

Redis中key对应的数据存在,但是已经过期了,这时候会去请求数据库,重置缓存,如果此时有大批量请求,也是直达数据库,也有可能压垮数据库。

3:缓存雪崩:

当缓存服务器重启或者同时大批量的缓存过期的时候,这时候也是有数据库扛不住压力的风险的。

解决方案

1.1:缓存穿透解决方案一

使用布隆过滤器。将所有可能存在的数据哈希存储到一个足够大的bitmap中,进行数据查询时,先进行bitmap的过滤,从而避免对底层存储系统的查询压力。

1.2:缓存穿透解决方案二

将查询不到的数据,也做空值的缓存,过期时间可以设置短一点,3-5分钟这样。

2.1:缓存击穿解决方案

使用互斥锁。就是在缓存失效的时候,判断取出的值是不是为空,如果为空,不是立即去查询数据库,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去设置一个mutex key,当操作返回成功时,再查询数据库并回设缓存;否则,就重试整个get缓存的方法。
注:SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。

3.1:缓存雪崩解决方案

针对服务器重启这种,设置双缓存方案,也就是备份缓存,主缓存时间短,备份缓存时间长,做高可用缓存服务器,主服务器宕机及时切换到备份服务器。

针对大批量数据同时失效的问题,可以在设置失效时长的时候设置随机数。

你可能感兴趣的:(Redis缓存穿透、缓存击穿、缓存雪崩)