缓存穿透
正常业务下,一个请求查询到数据后,我们可以将这个数据保存在Redis
之后的请求都可以直接从Redis查询,就不需要再连接数据库了
如果一个请求查询的数据,数据库中没有会发生什么事情?
它会先查询Redis,Redis没有会查询数据库,数据库也没有这就是缓存穿透
因为数据库中没有数据,所以Redis也无法保存数据,如果这个请求反复出现,就会反复连接数据库,严重的导致数据库性能降低甚至宕机
解决方案:业界主流解决方案:布隆过滤器
布隆过滤器的使用步骤
-
针对现有所有数据,生成布隆过滤器
-
在业务逻辑层,判断Redis之前先检查这个id是否在布隆过滤器中
-
如果布隆过滤器判断这个id不存在,直接返回
-
如果布隆过滤器判断id存在,在进行后面业务执行
缓存击穿
一个计划在Redis保存的数据,业务查询,查询到的数据Redis中没有,但是数据库中有
这种情况要从数据库中查询后再保存到Redis,这就是缓存击穿
但是这个情况也不是异常情况,因为我们大多数数据都需要设置过期时间,而过期时间到时,这些数据一定会从数据库中再次同步
缓存雪崩
上面讲到击穿现象,同一时间发生少量击穿是正常的。
若同时大量缓存失效,例如百分之80的缓存都在5000毫秒后过期导致请求都压在mysql上,mysql承担不了,非常可能导致异常
要想避免这种情况,就需要避免大量缓存同时失效
大量缓存同时失效的原因:通常是同时加载的数据设置了相同的有效期导致的
那么我们需要在设置有效期时添加一个随机数,大量数据就不会同时失效了,