深入理解Redis原理:缓存雪崩/击穿/穿透/预热/降级

目录

1、缓存雪崩

1.1、什么是缓存雪崩

1.2、解决缓存雪崩

2、缓存击穿

2.1、什么是缓存击穿

2.2、解决缓存击穿

3、缓存穿透

3.1、什么是缓存穿透

3.2、解决缓存穿透

3.3、基于RedisBloom实现布隆过滤器

4、缓存预热

4.1、什么是缓存预热

4.2、解决缓存预热

5、缓存降级

5.1、什么是缓存降级


下一篇:redis 5种数据结构及底层实现原理

1、缓存雪崩

1.1、什么是缓存雪崩

如果缓在某一个时刻出现大规模的key失效,那么就会导致大量的请求打在了数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。这就是缓存雪崩

1.2、解决缓存雪崩

(1)雪崩前

  • 开启redis持久化配置
  • 均匀过期: 设置不同的过期时间,让缓存失效的时间尽量均匀;
  • 多级缓存: 第一级缓存失效的基础上,访问二级缓存,每一级缓存的失效时间都不同;
  • 热点数据缓存永远不过期。

(2)雪崩中

  • 互斥锁:在缓存失效后,通过互斥锁或者队列来控制读数据写缓存的线程数量;
  • 熔断、限流:当流量达到一定的阈值,直接返回“系统拥挤,至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。

(3)雪崩后

  • 根据AOF和RDB文件,尽快恢复缓存数据;
  • 监控报警

2、缓存击穿

2.1、什么是缓存击穿

缓存雪崩是大规模的key失效,而缓存击穿是某个热点的key失效,大并发集中对其进行请求,引起数据库压力剧增。

2.2、解决缓存击穿

(1)热点key永不过期

(2)使用互斥锁:在获取数据时,使用分布式锁来控制同时只有一个请求可以去后端获取数据,其他请求需要等待锁释放。这样可以防止多个请求同时穿透到后端存储

3、缓存穿透

3.1、什么是缓存穿透

指用户请求的数据在缓存中、数据库中都不存在,导致用户每次请求该数据都要去数据库中查询一遍。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大宕机。

3.2、解决缓存穿透

(1)缓存空数据(少用)

存在的问题:假如传进来的这个不存在的Key值每次都是随机的,那存进Redis也没有意义

(2)布隆过滤器

如果布隆过滤器判定某个 key 不存在布隆过滤器中,那么就一定不存在,

可以在缓存之前再加一个布隆过滤器,将数据库中的所有key都存储在布隆过滤器中,在查询Redis前先去布隆过滤器查询 key 是否存在,如果不存在就直接返回,不让其访问数据库。

深入理解Redis原理:缓存雪崩/击穿/穿透/预热/降级_第1张图片

3.3、基于RedisBloom实现布隆过滤器

   // 创建一个布隆过滤器
   RedisBloomClient client = new RedisBloomClient("localhost", 6379);
   String filterName = "myFilter";
   long expectedInsertions = 1000;
   double falsePositiveRate = 0.01;
   boolean result = client.createFilter(filterName, expectedInsertions, falsePositiveRate);

   // 向布隆过滤器中添加元素
   String element = "example";
   boolean added = client.add(filterName, element);

   // 检查元素是否存在于布隆过滤器中
   boolean exists = client.exists(filterName, element);

4、缓存预热

4.1、什么是缓存预热

缓存预热是指系统上线后,提前将相关的缓存数据加载到缓存系统。避免在用户请求的时候,先查询数据库。

4.2、解决缓存预热

(1)数据量小:工程启动时加载或者不主动预热;

(2)数据量大:定时任务进行缓存刷新;

(3)数据量太大:优先保证热点数据进行提前加载到缓存

5、缓存降级

5.1、什么是缓存降级

缓存失效或缓存服务器挂掉的情况下,不去访问数据库,直接返回 默认数据 或 服务的内存数据。

你可能感兴趣的:(Redis,缓存)