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

一、缓存预热

1.什么是缓存预热?

        当系统上线时,缓存内还没有数据,如果直接提供给用户使用,每个请求都会穿过缓存去访问底层数据库,如果并发大的话,很有可能在上线当天就会宕机,因此我们需要在上线前先将数据库内的热点数据缓存至Redis内再提供出去使用,这种操作就成为"缓存预热"。

2.问题排查

  • 请求数量较高
  • 主从之间数据吞吐量较大,数据同步操作频度较高

3.解决方案

1.日常例行统计数据访问记录,统计访问频度较高的热点数据

2.利用LRU数据删除策略, 构建数据留存队列

3.将统计结果中的数据分类, 根据级别, red is优先加载级别较高的热点数据

4.利用分布式多服务器同时进行数据读取,提速数据加载过程

二、缓存穿透

1.什么是缓存穿透?

        缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。

2.问题排查

  • Redis中大面积出现未命中
  • 出现非正常URL访问

3.问题分析

  • 获取的数据在数据库中也不存在,数据库查询未得到对应数据
  • Redis获取到null数据未进行持久化, 直接返回
  • 下次此类数据到达重复上述过程
  • 出现黑客攻击服务器

4.解决方案

  1. 缓存null:对查询结果为null的数据进行缓存(长期使用, 定期清理) , 设定短时限, 例如30-60秒,最高5分钟
  2. 布隆过滤:

    布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中。

三、缓存击穿

1.什么是缓存击穿?

        缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。这种现象就叫做缓存击穿。

2.问题分析

某个热点的key失效了,导致大并发集中打在数据库上。

解决方向:第一是否可以考虑热点key不设置过期时间

                  第二是否可以考虑降低打在数据库上的请求数量。

3.解决方案

  1. 使用互斥锁:即根据key获取value值为空时,锁上,从数据库中load数据后再释放锁。若其它线程获取锁失败,则等待一段时间后重试。
  2. 布隆过滤器:bloomfilter就类似于一个hash set,用于快速判某个元素是否存在于集合中,其典型的应用场景就是快速判断一个key是否存在于某容器,不存在就直接返回。

四、缓存雪崩

1.什么是缓存雪崩?

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

2.问题分析

      造成缓存雪崩的关键在于同一时间的大规模的key失效,主要有两种可能:第一种是Redis宕机,第二种可能就是采用了相同的过期时间。

3.解决方案

  1. 给不同的Key的TTL添加随机值
  2. 利用Redis集群提高服务的可用性
  3. 给缓存业务添加降级限流策略
  4. 给业务添加多级缓存

你可能感兴趣的:(缓存,redis,数据库)