Redis中的缓存穿透|缓存击穿|缓存雪崩
Redis是一种内存数据库,也就是说,它是一种存储在内存中的数据库. 相当于Redis是提供一种缓存服务,提供这种缓存服务的有很多种,包括Redis,MongoDB等,其中国内用的最多的最常见的可能就是Redis
既然是缓存服务,那么就可能存在缓存穿透,缓存击穿和缓存雪崩的现象存在,现在我们来分别详细描述一下这3种现象,以及对应的解决策略:
1. 缓存穿透
描述:缓存穿透指的是访问的是一个数据库和缓存中都不存在的key, 其实就是说访问数据库中压根不存在的数据. 整个访问流程是这样的=> 试图访问一个数据库和Redis缓存中都不存在的key, 首先访问Reids,显然不存在。于是就进一步去直接访问DB,也没有查询到相关数据,也没法写入缓存(如果DB中有,而缓存中没有,那么可以把DB中的写入缓存). 如果存在大批量的这种请求,就会每次"穿透"缓存直接抵达DB (此时缓存就好像 "穿透" 了一样), 引发DB的高并发查询导致宕机,这种现象就叫做 "缓存穿透"
解决方法:
1.1. 接口校验 => 我们可以想象,这种访问数据库DB和缓存中都不存在的key的情况, 在实际业务中应该很少出现. 如果突然出现大量的访问DB和缓存中都不存在的key的情况, 这种场景很有可能是遭受了非法攻击. =》 那么解决方法就来了,我们要想办法过滤到非法的攻击, 那就是在最外层做一层校验: 比如用户鉴权, 数据合法性校验等等. => 比如说一个人的年龄肯定是正整数,那么就可以对key为负数或者0的直接过滤掉
1.2 缓存空值 => 当访问缓存和DB都没有查询到值时,可以将空值/默认值写进缓存. 然后针对这个key设置较短的缓存过期时间.
1.3 布隆过滤器 => 这种是说,使用布隆过滤器存储所有可能访问的key, 当针对某一个key的查询进来时,先到这个布隆过滤器里看看有没有这个key, 如果没有,直接过滤,放弃这次查询。如果有,再去进一步查询缓存和数据库
2. 缓存击穿
描述:缓存击穿,重点就在这个"击"字,这说明一下子有大量的请求在同一个瞬间过来。确实是的,某一个热点Key, 存在redis缓存中, 但是刚好此时此刻,它刚好到过期时间,而就在它过期的这一瞬间, 同时有大量的请求打进来,这些大量请求先到缓存, 可是此时缓存又过期了,就只能去访问数据库了,也就是说这一瞬间,大量的请求直接打到数据库, 造成这一瞬间数据库请求量巨大,压力剧增,很可能直接打垮数据库