Redis的缓存穿透、缓存击穿、缓存雪崩

目录

一、缓存穿透

1.什么是缓存穿透

2.常见的缓存穿透情况

3.缓存穿透会带来的问题 

4.解决缓存穿透问题可以采取的方法 

5.总结

二、缓存击穿

1.什么是缓存击穿

2. 常见的缓存击穿情况

3. 缓存击穿会带来的问题

4. 解决缓存击穿问题可以采取的方法 

5.总结

三、缓存雪崩

1.什么是缓存雪崩

2.常见的缓存雪崩情况

3. 缓存雪崩会带来的问题

4. 解决缓存雪崩问题可以采取的方法

5.总结

四、Redis问题小结

1.共同点:

2.解决方法:


一、缓存穿透

1.什么是缓存穿透

缓存穿透是指在使用缓存系统时,特定的查询在缓存和数据库中都找不到结果,导致每次查询都要访问数据库,从而增加数据库的压力,降低系统的性能。

当一个查询请求经过缓存系统时,缓存先检查是否有缓存的结果,如果有则直接返回给客户端,如果没有则查询数据库并将结果存入缓存后返回。但是,如果查询的数据在数据库中不存在,那么每次查询都会通过缓存系统直接访问数据库,导致数据库无效查询增加,浪费了系统资源。

2.常见的缓存穿透情况

  1. 查询不存在的数据:当用户查询一个不存在的数据,例如某个不存在的用户ID,由于缓存中没有缓存该数据,每次查询都会失败并直接访问数据库。

  2. 恶意查询:如果攻击者故意发送大量不存在的请求,试图绕过缓存,并导致大量无效的数据库查询请求。

3.缓存穿透会带来的问题 

  1. 增加数据库负载:由于缓存穿透导致大量无效的数据库查询操作,增加了数据库的负载,可能导致数据库性能下降。

  2. 击穿缓存:如果缓存中缓存了查询结果为空的键,恶意攻击者可以通过大量请求这些不存在的键,使缓存中的该键过期,从而导致后续请求都直接访问数据库,形成缓存击穿

4.解决缓存穿透问题可以采取的方法 

  1. 布隆过滤器(Bloom Filter):在查询前先通过布隆过滤器快速判断查询的数据是否存在,若不存在则不再访问缓存和数据库,减轻数据库压力。

  2. 空结果缓存:在缓存中存储空结果的键,可以避免缓存穿透,防止恶意攻击。

  3. 延迟双写:在查询到数据库不存在该数据时,在缓存中也写入一个空结果的占位符,设置较短的过期时间,以防止并发大量请求穿透缓存直接访问数据库。

  4. 异步更新缓存:当发现缓存和数据库中都不存在某个查询结果时,可以使用异步更新缓存的方式,先返回空结果给用户,然后通过后台任务去查询数据库并更新缓存,提高查询的响应速度和系统的并发能力。

5.总结

 综上所述,缓存穿透是一种常见的缓存问题,采取适当的预防措施可以避免对数据库造成不必要的压力,并提高系统的性能和稳定性。

二、缓存击穿

1.什么是缓存击穿

缓存击穿是指在使用缓存系统时,一个热门的、经常被访问的数据缓存过期或失效时,大量并发请求同时涌入,直接访问数据库,导致数据库负载剧增,造成系统性能下降甚至崩溃的情况。

2. 常见的缓存击穿情况

  1. 高并发热点数据:某个数据非常热门,并且被大量并发请求频繁访问。如果该数据的缓存过期或者被意外清空,大量的请求会直接访问数据库,导致数据库压力激增。

  2. 突发请求:在某个时间点突然出现大量请求访问某个数据,而该数据的缓存恰好在此时失效,导致大量请求绕过缓存直接访问数据库。

3. 缓存击穿会带来的问题

  1. 增加数据库负载:大量并发请求同时访问数据库,导致数据库性能下降,甚至崩溃。

  2. 响应时间延长:绕过缓存直接访问数据库,数据库响应时间增加,造成请求的响应时间延长。

4. 解决缓存击穿问题可以采取的方法 

  1. 加锁或互斥机制:在缓存失效时,只允许一个请求访问数据库,并将结果缓存,其他请求等待并从缓存中获取数据。

  2. 热点数据永远不过期:对于热点数据,可以将其缓存时间设置为永不过期,或者设置一个合理的较长过期时间,确保不会频繁去访问数据库。

  3. 异步更新缓存:当某个热点数据的缓存过期时,可以使用异步任务来更新缓存,先返回旧的缓存结果给请求,然后在后台异步更新缓存。

  4. 限流和降级:对于突发的大量请求,可以采取限流策略,限制并发访问的请求数量,或者通过降级策略返回预设的默认值,避免数据库负载过大。

  5. 前置缓存:在缓存层之前添加一个前置缓存(如CDN等),将请求分摊到多个缓存节点,减轻热点数据的单一缓存节点压力。

5.总结

综上所述,缓存击穿是一种常见的缓存问题,通过合理的缓存策略、并发控制和异步更新缓存等手段可以有效避免和应对缓存击穿问题,提高系统的性能和稳定性。 

三、缓存雪崩

1.什么是缓存雪崩

缓存雪崩是指在使用缓存系统时,大量缓存失效或过期,导致原本应该由缓存提供的数据,都需要从数据库中重新加载,从而引发数据库压力剧增、性能下降,甚至系统崩溃的现象。

2.常见的缓存雪崩情况

  1. 缓存批量失效:多个缓存键的过期时间或失效时间几乎同时到达,导致大量缓存同时失效。

  2. 重启或故障:缓存系统出现重启、宕机或故障,导致缓存中的所有数据一时无法访问,请求直接访问数据库。

  3. 数据库压力:当缓存失效后,大量请求同时涌入数据库,因为数据库无法承受如此大的压力而导致性能下降。

3. 缓存雪崩会带来的问题

  1. 数据库压力过大:大量请求直接访问数据库,导致数据库处理能力不足,出现性能问题,甚至引发数据库崩溃。

  2. 响应时间延长:由于缓存失效,请求需要直接访问数据库,导致响应时间延长。

4. 解决缓存雪崩问题可以采取的方法

  1. 设置随机过期时间:为了避免大量缓存同时失效,可以为不同的缓存设置稍有差异的过期时间,分散缓存过期的可能性。

  2. 二级缓存机制:使用多级缓存,将数据同时存储到多个缓存层,一级缓存失效时可以从二级缓存中获取数据,避免所有缓存同时失效。

  3. 并发重建缓存:在缓存失效的时候,通过加锁或者分布式锁的方式,只允许一个请求去加载数据并重新构建缓存,其他请求等待并从缓存中获取数据。

  4. 缓存预热:在系统低峰期,提前加载热门的缓存数据,避免在高峰期同时加载大量缓存数据。

  5. 容灾备份:设置多个缓存节点,保证缓存的高可用性,一旦某个缓存节点发生故障,可以快速切换到其他节点。

  6. 异步更新缓存:对于热点数据,可以使用异步任务来更新缓存,避免大量的请求同时涌入数据库。

5.总结

综上所述,缓存雪崩是一种常见的缓存问题,在系统设计和缓存策略上采取合理的措施可以有效预防和处理缓存雪崩,提高系统的可用性和稳定性。

四、Redis问题小结

Redis的缓存穿透、缓存击穿和缓存雪崩都是与缓存相关的常见问题,它们有一些共同点,并可以采用类似的解决方法:

1.共同点:

  1. 都会导致大量请求直接访问数据库,增加数据库负载和降低系统性能。
  2. 都与缓存失效或过期相关,导致缓存无法提供预期的数据。

2.解决方法:

  1. 设置合理的缓存策略:包括设置适当的缓存过期时间、根据业务情况决定是否使用永不过期的策略,避免缓存同时失效或过期导致的问题。

  2. 使用布隆过滤器(Bloom Filter):在查询前使用布隆过滤器快速判断查询的数据是否存在,避免无效的数据库查询操作。

  3. 多级缓存机制:使用多级缓存,将数据同时存储到多个缓存层,一级缓存失效时可以从其他级别的缓存获取数据,避免所有缓存同时失效。

  4. 并发控制机制:通过加锁或互斥机制控制并发访问数据库的请求数量,防止缓存失效时大量请求同时涌入数据库。

  5. 异步更新缓存:针对热点数据,使用异步任务来

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