缓存雪崩、穿透和失效问题

1、缓存雪崩: redis 集群彻底崩溃后,大量请求直接打到 mysql 上面,导致 mysql 也崩溃继而导致源服务乃至整个网站崩溃
解决方案:
事前:发生缓存雪崩之前怎么防止 redis 挂掉

  • redis集群部署(冗余slave部署),利用redis本身的主从切换的高可用性
  • 双机房部署,一套集群部署在两个机房或两个机房各自部署一套集群
事中:redis 集群已挂
  • 三层缓存架构,nginx本地缓存 + redis 集群 + ehcache 本地缓存服务
  • 对 redis 集群访问进行资源隔离和提供降级处理,防止大量请求超时缓存服务崩溃
  • 对源服务的访问进行限流和资源隔离,防止大量请求涌入源服务导致其挂掉
事后:redis 集群重启时
  • 对 redis 做热备和冷备(RDB 和 AOF),快速启动 redis 集群
  • 启动时对 redis 做快速预热,防止启动后再次崩溃
2、缓存穿透:大量请求在穿过缓存直接访问 redis 且每次执行结果都为空,导致各层缓存机制失效,当请求到达一定大时就会把 mysql 打死
解决方案:把查询结果为空的数据也放在 redis 集群 + 缓存服务 + nginx 里面
3、缓存失效:大量缓存设置了同一过期时间失效,导致大量请求突然穿过缓存直接访问后端服务,大量的网络请求导致网络负载加重或者服务挂掉
【缓存雪崩、穿透和失效问题】解决方案:在 nginx 端给缓存设置一定范围内的随机过期时间避免大量缓存数据在同一时间过期

    推荐阅读