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

更多面试题请看这里: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 监控面板实时展示
相关推荐
jiayong236 分钟前
知识库概念与核心价值01
java·人工智能·spring·知识库
皮皮林55119 分钟前
告别 OOM:EasyExcel 百万数据导出最佳实践(附开箱即用增强工具类)
java
Da Da 泓1 小时前
多线程(七)【线程池】
java·开发语言·线程池·多线程
To Be Clean Coder1 小时前
【Spring源码】getBean源码实战(三)
java·mysql·spring
Wokoo71 小时前
开发者AI大模型学习与接入指南
java·人工智能·学习·架构
电摇小人2 小时前
我的“C++之旅”(博客之星主题作文)
java·开发语言
资生算法程序员_畅想家_剑魔2 小时前
Java常见技术分享-23-多线程安全-总结
java·开发语言
萧曵 丶2 小时前
ArrayList 和 HashMap 自动扩容机制详解
java·开发语言·面试
这是程序猿2 小时前
基于java的ssm框架学生作业管理系统
java·开发语言·spring boot·spring·学生作业管理系统
千百元2 小时前
限制网段访问服务器端口63790
java·网络·mybatis