首页 > 其他分享 >缓存击穿、穿透、雪崩

缓存击穿、穿透、雪崩

时间:2023-03-18 15:35:59浏览次数:34  
标签:缓存 Key 击穿 数据库 Redis 雪崩 key 查不到

缓存穿透

概念:请求数据库访问时,假如发送的请求传进来的key是不存在Redis中的,那么就查不到缓存,查不到缓存就会去数据库查询。

怎么发生:

  • 服务器被攻击
  • 误删热点key

怎么解决:

  1. 把无效的Key存进Redis中。如果Redis查不到数据,数据库也查不到,我们把这个Key值保存进Redis,设置value="null",当下次再通过这个Key查询时就不需要再查询数据库。这种处理方式肯定是有问题的,假如传进来的这个不存在的Key值每次都是随机的,那存进Redis也没有意义。
  2. 使用布隆过滤器。布隆过滤器的作用是某个 key 不存在,那么就一定不存在,它说某个 key 存在,那么很大可能是存在(存在一定的误判率)。于是我们可以在缓存之前再加一层布隆过滤器,在查询的时候先去布隆过滤器查询 key 是否存在,如果不存在就直接返回。(不存在一定不存在,存在不一定存在)

 

缓存雪崩

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

怎么发生:

  • 缓存雪崩 主要是同一时间大规模缓存失效,所以有两种情况
  • Redis宕机
  • key采用了相同的过期时间

怎么解决:

  • 在原有的失效时间上加上一个随机值,比如1-5分钟随机。这样就避免了因为采用相同的过期时间导致的缓存雪崩。
  • 在允许的情况下,设置热点key永不过期
  • 搭建Redis集群,提高Redis的容灾性。

 

缓存击穿

概念:假如发送的请求传进来的key是不存在Redis中的,那么就查不到缓存,查不到缓存就会去数据库查询。

怎么解决:

  • 如果业务允许的话,对于热点的key可以设置永不过期的key。
  • 使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库打死。当然这样会导致系统的性能变差。

缓存雪崩与缓存击穿有点类似,缓存雪崩是大规模的key失效,而缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了

 

标签:缓存,Key,击穿,数据库,Redis,雪崩,key,查不到
From: https://www.cnblogs.com/wintermist/p/17230861.html

相关文章