Redis 缓存雪崩、缓存穿透、缓存击穿 问题分析及处理方案

Redis 缓存雪崩、缓存穿透、缓存击穿 问题分析及处理方案
最新回答
指尖落樱舞

2023-04-20 16:58:41

缓存雪崩问题分析
  • 问题描述:当缓存集中在一段时间内失效或者缓存服务器出现宕机时,所有请求都直接落入数据库,导致数据库扛不住压力而挂掉。
  • 解决方案

    事前:采用Redis高可用方案,如主从+哨兵模式或Redis cluster,避免全盘崩溃。

    事中

    使用本地ehcache缓存结合hystrix限流&降级机制,避免MySQL被大量请求打死。

    通过缓存reload机制,预先更新缓存,在即将发生大并发访问前手动触发加载缓存。

    事后:利用Redis持久化功能,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

缓存穿透问题分析
  • 问题描述:查询一个一定不存在的数据时,缓存查不到,再去数据库查也查不到。这样的请求每次无视缓存,直接查询数据库。当该类流量大量流入或者存在恶意攻击场景时,缓存穿透会直接把数据库打死。
  • 解决方案:在数据库中没有查到数据时,写一个空值到缓存中去(例如set -999 UNKNOWN),并设计一个合理的过期时间。
缓存击穿问题分析
  • 问题描述:缓存击穿是指某个热点key访问非常频繁,处于集中式高并发访问的情况。当这个key在失效的瞬间,大量请求击穿缓存,直接请求数据库,就像在屏障上凿开了一个洞。
  • 解决方案

    若缓存数据基本不会更新:尝试将该热点数据设置为永不过期。

    若缓存数据更新不频繁且刷新流程耗时较少:采用基于Redis、zookeeper等分布式中间件的分布式互斥锁,或者本地互斥锁,保证仅少量请求能请求数据库并重新构建缓存,其余线程在锁释放后访问新缓存。

    若缓存数据更新频繁或刷新流程耗时较长:利用定时线程在缓存过期前主动重新构建缓存,或者延后缓存的过期时间,确保所有请求能一直访问到对应的缓存。