缓存穿透,缓存击穿,缓存雪崩是什么如何解决
都依凡
撰写于 2023年 05月 23 日

1. 什么是缓存穿透

150

缓存穿透指的是一个缓存系统无法缓存某个查询的数据,从而导致这个查询每一次都要访问数据库

个人理解,缓存穿透是指要访问的数据既不在缓存中,也不在数据库中,导致请求在访问缓存时没有找到对应的数据,再去请求数据库也没有找到数据,无法将数据写入缓存,这样一来缓存就变为了摆设,就会同时给缓存和数据库造成压力

常见的Redis缓存穿透场景包括:

  1. 查询一个不存在的数据,攻击者可能发送一些无效的查询来触发缓存穿透
  2. 查询一些非常热门的数据,如果一个数据被访问的非常频繁,那么可能会导致缓存系统无法处理这些请求,从而造成缓存穿透
  3. 查询一些异常数据:这种情况通常发生在数据服务出现故障或异常时,从而造成缓存系统无法访问相关数据,从而导致缓存穿透。

2. 如何解决缓存穿透

解决方案一

缓存空值或者缺省的值

一旦发生缓存穿透,我们就可以针对查询的数据,再Redis中缓存一个空值或者确定的缺省值,(就是随便一个可以表示缺省的值),紧接着,发送后续的查询的时候就可以从缓存中获取到缺省值了,保证了数据库的正常运行

解决方案二

使用布隆过滤器快速判断数据是否存在

3. 什么是缓存击穿

149

缓存击穿往往出现在高并发访问的情况下,一个热点数据从缓存在查不存在,就要去数据库中查询,从而导致数据库的压力过大,导致系统性能下降

缓存击穿的原因通常有以下几种:

  1. 缓存中不存在所需要的热点数据,每当系统中的某个热点数据需要频繁访问的时候,同时去访问数据库,给数据库造负担
  2. 缓存热点的数据过期,当一个热点数据过期,并且需要重新缓存时候,若此时有大量请求也会因为缓存中的数据过期而去数据库中查询,给数据库造成负担。

4. 如何解决缓存击穿

解决方案一

设置热点数据永不过期

设置热点数据永不过期就是不给key设置过期的时间即可

还有第二种方式也可以达到key值永不过期,就是正常的给key值设置过期时间,在后台启动一个定时任务在他过期前去定时地更新这个缓存,并重新设置他的过期时间

解决方案二

分布式锁并发更新

锁的对象就是key,这样如果有大量请求并发进来时,只能有一个请求获取到锁,然后获取到锁的线程去查询数据库,将查询到的数据放入到缓存中,此时,缓存中已经有数据了,后面的请求就可以从缓存中获取到数据返回,并不会查询数据库

5. 什么是缓存雪崩

151

缓存雪崩是指大量的请求无法在Redis中进行处理,紧接着大量的请求发送到数据库层,导致数据库压力过大

常见的缓存雪崩的场景:

  1. 缓存服务器宕机,当缓存服务器宕机或者重启时,大量的访问请求直接命中数据库,在同一时间导致大量的数据查询,从而数据库的压力增大
  2. 缓存数据同时失效,在某个特定的时间点,缓存中的数据大量失效,并在同一个时间点,有大量的请求集中在一起

6. 如何解决缓存雪崩

解决方案一

避免给大量的数据设置相同的过期时间,如果业务层有些数据同时失效,可以给每个数据设置一个较短的过期间隔,(在不影响业务的情况下,特殊情况特殊处理)

解决方案二

缓存预热

缓存预热就是在系统启动或者失效时,手动加载数据到缓存中,这样实际请求的时候就可以直接从缓存中获取数据

缓存穿透,缓存击穿,缓存雪崩是什么如何解决

1. 什么是缓存穿透

150

缓存穿透指的是一个缓存系统无法缓存某个查询的数据,从而导致这个查询每一次都要访问数据库

个人理解,缓存穿透是指要访问的数据既不在缓存中,也不在数据库中,导致请求在访问缓存时没有找到对应的数据,再去请求数据库也没有找到数据,无法将数据写入缓存,这样一来缓存就变为了摆设,就会同时给缓存和数据库造成压力

常见的Redis缓存穿透场景包括:

  1. 查询一个不存在的数据,攻击者可能发送一些无效的查询来触发缓存穿透
  2. 查询一些非常热门的数据,如果一个数据被访问的非常频繁,那么可能会导致缓存系统无法处理这些请求,从而造成缓存穿透
  3. 查询一些异常数据:这种情况通常发生在数据服务出现故障或异常时,从而造成缓存系统无法访问相关数据,从而导致缓存穿透。

2. 如何解决缓存穿透

解决方案一

缓存空值或者缺省的值

一旦发生缓存穿透,我们就可以针对查询的数据,再Redis中缓存一个空值或者确定的缺省值,(就是随便一个可以表示缺省的值),紧接着,发送后续的查询的时候就可以从缓存中获取到缺省值了,保证了数据库的正常运行

解决方案二

使用布隆过滤器快速判断数据是否存在

3. 什么是缓存击穿

149

缓存击穿往往出现在高并发访问的情况下,一个热点数据从缓存在查不存在,就要去数据库中查询,从而导致数据库的压力过大,导致系统性能下降

缓存击穿的原因通常有以下几种:

  1. 缓存中不存在所需要的热点数据,每当系统中的某个热点数据需要频繁访问的时候,同时去访问数据库,给数据库造负担
  2. 缓存热点的数据过期,当一个热点数据过期,并且需要重新缓存时候,若此时有大量请求也会因为缓存中的数据过期而去数据库中查询,给数据库造成负担。

4. 如何解决缓存击穿

解决方案一

设置热点数据永不过期

设置热点数据永不过期就是不给key设置过期的时间即可

还有第二种方式也可以达到key值永不过期,就是正常的给key值设置过期时间,在后台启动一个定时任务在他过期前去定时地更新这个缓存,并重新设置他的过期时间

解决方案二

分布式锁并发更新

锁的对象就是key,这样如果有大量请求并发进来时,只能有一个请求获取到锁,然后获取到锁的线程去查询数据库,将查询到的数据放入到缓存中,此时,缓存中已经有数据了,后面的请求就可以从缓存中获取到数据返回,并不会查询数据库

5. 什么是缓存雪崩

151

缓存雪崩是指大量的请求无法在Redis中进行处理,紧接着大量的请求发送到数据库层,导致数据库压力过大

常见的缓存雪崩的场景:

  1. 缓存服务器宕机,当缓存服务器宕机或者重启时,大量的访问请求直接命中数据库,在同一时间导致大量的数据查询,从而数据库的压力增大
  2. 缓存数据同时失效,在某个特定的时间点,缓存中的数据大量失效,并在同一个时间点,有大量的请求集中在一起

6. 如何解决缓存雪崩

解决方案一

避免给大量的数据设置相同的过期时间,如果业务层有些数据同时失效,可以给每个数据设置一个较短的过期间隔,(在不影响业务的情况下,特殊情况特殊处理)

解决方案二

缓存预热

缓存预热就是在系统启动或者失效时,手动加载数据到缓存中,这样实际请求的时候就可以直接从缓存中获取数据

版权属于:都依凡 所有,采用《知识共享署名许可协议》进行许可,转载请注明文章来源。

本文链接: http://blog.anlucky.cn/index.php/programming/database/152

赞 (5)

评论区(暂无评论)

啊哦,评论功能已关闭~