缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题

更多面试题请看这里:https://interview.raoyunsoft.com/

面试题专栏会持续更新欢迎关注订阅

一、缓存雪崩

问题本质 :大量缓存同时失效,导致请求直接穿透到数据库,引发数据库压力激增甚至宕机。
典型场景

  • 缓存集群重启
  • 相同过期时间的大批量缓存集中失效
  • 缓存服务不可用

解决方案

  1. 错峰失效:对缓存过期时间添加随机值(如基础时间±30分钟)
  2. 熔断降级:通过 Hystrix 等工具实现请求限流
  3. 多级缓存:采用本地缓存(Caffeine)+ Redis 的多层结构
  4. 热点永不过期:对核心数据设置逻辑过期时间,异步更新
graph LR A[请求] --> B{缓存是否存在?} B -- 是 --> C[返回缓存数据] B -- 否 --> D[数据库查询] D --> E[更新缓存] D --> F[返回数据] style B fill:#f9f,stroke:#333 style D stroke:#f00,stroke-width:2px
二、缓存穿透

问题本质 :恶意查询不存在的数据,绕过缓存直击数据库。
典型特征

  • 查询 key 在数据库不存在
  • 高并发非法请求(如遍历负整数 ID)

解决方案

  1. 布隆过滤器 (Bloom Filter):
    • 前置拦截非法 key
    • 使用 Redis 4.0+ 的 BF.ADD/BF.EXISTS 命令
    • 特点:空间效率极高,存在误判率(可控制在 1% 内)

key存在 key不存在 命中 未命中 请求 布隆过滤器 Redis缓存 直接返回空 返回数据 查数据库

  1. 空值缓存
    • 对查询为空的结果缓存短时间(如 5 分钟)
    • 需设置最大空值数量防止内存溢出

布隆过滤器原理

  • 使用 k 个哈希函数计算 key 的位图位置
  • 写入:所有位置置为 1
  • 查询:所有位置均为 1 则可能存在(有误判),任一为 0 则必然不存在

32bit/64bit 数据排重方案

数据类型 方案 空间复杂度
32bit Bitmap 512MB (2³² bit)
64bit 布隆过滤器+分片 可控误判率
三、缓存预热

核心思想 :系统上线前主动加载热点数据到缓存。
实施策略

  1. 定时任务:通过 Quartz 在低峰期预加载
  2. 启动加载 :Spring Boot 的 ApplicationRunner 初始化缓存
  3. 动态预热:基于 Nginx 日志分析实时热点 key

操作流程
后台系统 Redis DB 1. 查询热点数据列表 2. 返回空(首次) 3. 批量查询数据 4. Pipeline 批量写入 后台系统 Redis DB

四、缓存更新

更新策略对比

策略 优点 缺点 适用场景
定时清理 实现简单 实时性差 低频更新数据
请求触发更新 数据实时性强 增加请求延迟 高频访问核心数据
消息队列通知 解耦业务与缓存 系统复杂度高 分布式环境

最佳实践

  • 组合使用:核心数据用请求触发更新 + 普通数据定时清理
  • 写操作同步:DB 更新 → 发 MQ → 消费更新缓存
五、缓存降级

核心目标 :保障核心服务可用性,牺牲非关键功能。
降级策略

  1. 返回默认值
    • 如商品详情页库存显示"服务繁忙"
    • 使用 Hystrix 的 fallback 机制实现
  2. 开关降级
    • 通过 Apollo 配置中心动态切换降级策略
  3. 分级预案
故障级别 特征 应对措施
一般 短暂超时(<1s) 自动重试+日志记录
警告 成功率波动(90%-95%) 局部降级+邮件告警
错误 可用率<90% 全局降级+短信通知
严重错误 数据异常/连接池耗尽 人工介入+熔断所有非核心服务

降级原则

  • 优先保证读服务:如商品列表、详情页
  • 写服务谨慎降级:下单、支付必须保障一致性
  • 降级状态可视化:通过 Grafana 监控面板实时展示
相关推荐
risc1234561 分钟前
【备忘录】java.lang.Throwable#addSuppressed这个是干嘛的?
java·开发语言
代码or搬砖2 分钟前
Redis下载以及Redis常用命令
数据库·redis·缓存
__万波__2 分钟前
二十三种设计模式(十)--外观模式
java·设计模式·外观模式
Geoking.3 分钟前
深度理解 Java 中的 switch —— 从基础到进阶的完整指南
java
棋啊_Rachel3 分钟前
面试高频详解:Redis 缓存击穿、雪崩、穿透
redis·缓存·面试
今天你TLE了吗4 分钟前
Java:基于注解实现去重表消息防止重复消费
java·spring boot·分布式·spring cloud·幂等
没有bug.的程序员5 分钟前
大规模微服务下的 JVM 调优实战指南
java·jvm·spring·wpf·延迟
北友舰长5 分钟前
基于Springboot+vue大型商场应急预案管理系统的设计与实现【Java毕业设计·安装调试·代码讲解·文档报告】
java·vue.js·spring boot·mysql·商场·应急处理·应急
赵庆明老师6 分钟前
在ASP.NET Core Web Api中添加身份验证和授权
java·前端·asp.net
菜鸟小九6 分钟前
redis基础(java客户端)
java·redis·bootstrap