缓存穿透,缓存击穿,缓存雪崩

ops/2025/3/3 23:04:21/

用「银行防盗系统」类比理解缓存问题


一、缓存穿透(查无此人攻击)

场景:黑客伪造不存在的账户ID频繁查询
类比:小偷用假身份证到银行金库门口反复试开锁

请求 → 缓存 → 不存在 → 数据库 → 不存在(每次穿透)

解决方案

  1. 布隆过滤器(门禁白名单)
    // 初始化过滤器
    BloomFilter<String> filter = BloomFilter.create(1000000);
    // 预热合法ID
    validIds.forEach(filter::put);// 查询前校验
    if(!filter.mightContain(id)) return null;
    
  2. 空值缓存(记录黑名单)
    redisTemplate.opsForValue().set(id, "NULL", 5, TimeUnit.MINUTES);
    

二、缓存击穿(爆破热点数据)

场景:百万用户同时访问刚过期的爆款商品
类比:劫匪在运钞车到达前瞬间集体冲击金库

缓存失效 → 大量请求涌入数据库

解决方案

  1. 互斥锁(武装押运)
    public Object getData(String key) {Object value = redis.get(key);if (value == null) {if (redis.setnx(key+"_lock", "1")) { // 抢锁value = db.query(key);          // 查库redis.set(key, value, 30, TimeUnit.MINUTES);redis.del(key+"_lock");} else {Thread.sleep(100);             // 重试return getData(key);}}return value;
    }
    
  2. 逻辑过期(延长押运时间)
    // 缓存值包含过期时间
    class CacheData {Object data;long expireTime;
    }
    // 异步更新缓存
    

三、缓存雪崩(系统性崩溃)

场景:双十一零点大量缓存同时失效
类比:全城银行同时断电导致安防系统瘫痪

缓存层崩溃 → 数据库被流量击垮 → 服务不可用

解决方案

  1. 随机过期时间(错峰维护)
    int randomTime = 30 + new Random().nextInt(15); // 30-45分钟
    redisTemplate.opsForValue().set(key, value, randomTime, TimeUnit.MINUTES);
    
  2. 二级缓存(备用电源)
    // Ehcache本地缓存 + Redis分布式缓存
    @Cacheable(cacheNames = "user", key = "#id",cacheManager = "ehcacheManager")
    public User getUser(int id) { /*...*/ }
    
  3. 熔断降级(应急通道)
    // 使用Hystrix熔断
    @HystrixCommand(fallbackMethod = "getDefaultData")
    public Object getHotData(String key) { /*...*/ }
    

四、防御系统对比表

攻击类型类比场景防御策略监控指标
穿透假身份试开锁布隆过滤器 + 空值缓存cache_miss_rate↑↑
击穿集中爆破金库互斥锁 + 逻辑过期qps_spike_detect
雪崩全城安防瘫痪随机过期 + 熔断降级db_connection_pool↑

五、生产环境组合拳

电商系统示例

  1. 接入层:Nginx限流(每秒5000请求)
  2. 服务层:Guava本地缓存 + Redis集群
  3. 存储层:MySQL读写分离 + 队列削峰

Redis配置示例

# 开启内存淘汰策略
maxmemory-policy volatile-ttl
# 设置连接超时防止雪崩
timeout 30
# 监控关键指标
redis-cli --latency-history -i 10

六、面试高频问题

Q1:布隆过滤器为什么不能删除数据?
  • 位图共享:多个数据可能映射到同一位(误删他人钥匙)
  • 解决方案:使用Counting Bloom Filter(但增加内存)
Q2:互斥锁造成死锁怎么办?
  • 超时释放redis.setnx(key, "1", 10, TimeUnit.SECONDS)
  • 守护线程:定期检测锁持有者是否存活
Q3:如何发现缓存雪崩前兆?
  • 监控指标
    • 缓存命中率持续低于80%
    • 数据库连接数突增
    • Redis CPU使用率>90%

七、灾备演练方案

  1. 混沌工程:随机杀死Redis节点测试容错
  2. 压测工具:JMeter模拟百万QPS冲击
  3. 降级预案
    • 一级降级:关闭非核心服务
    • 二级降级:返回静态默认数据

终极总结

缓存问题防御 = 银行安全体系

  • 穿透防御:严格身份核验(布隆过滤器)
  • 击穿防御:重点目标保护(互斥锁)
  • 雪崩防御:分散风险策略(随机过期)

记住这个公式:预防 > 检测 > 修复,建立全方位缓存安防体系!


http://www.ppmy.cn/ops/162888.html

相关文章

kafka小白基础知识

一、Kafka 入门 &#xff08;一&#xff09;Kafka 简介 Kafka 是一个开源的分布式流处理平台&#xff0c;最初由 LinkedIn 开发&#xff0c;后来贡献给了 Apache 软件基金会。它被设计用于处理实时数据流&#xff0c;具有高吞吐量、可扩展性、持久性和容错性等特点。Kafka 主要…

Flutter 3.29.0 版本对颜色Color做出的改动 Display P3你了解吗

Color的更改 添加一个枚举字段&#xff0c;指定其ColorSpace。添加API以使用规范化的浮点颜色组件。删除使用可能导致数据丢失的8位无符号整数颜色组件的API。 ColorSpace 的更改 添加displayP3属性。 Display P3是苹果为平衡广色域与消费级显示需求优化的色彩标准&#xf…

深度解析Ant Design Pro 6开发实践

深度解析Ant Design Pro 6全栈开发实践&#xff1a;从架构设计到企业级应用落地 一、Ant Design Pro 6核心特性与生态定位&#xff08;技术架构分析&#xff09; 作为Ant Design生态体系的旗舰级企业应用中台框架&#xff0c;Ant Design Pro 6基于以下技术栈实现突破性升级&am…

AI 自动化编程盛行,程序员失业是个xx命题

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 AI 自…

‌KNN算法优化实战分享——基于空间数据结构的工业级实战指南

‌作者&#xff1a;‌ 某大厂空间计算架构师 ‌发布日期&#xff1a;2025年02月27日‌ ‌适用场景&#xff1a;地理信息系统&#xff08;GIS&#xff09;、自动驾驶、物流调度等海量空间数据查询‌ ‌一、生产环境代码模板‌ 1.1 KD-Tree批量化构建与查询&#xff08;千万级数…

2024贵州大学计算机考研复试上机真题

历年贵州大学计算机考研复试上机真题 2024贵州大学计算机考研复试上机真题 2023贵州大学计算机考研复试上机真题 贵州大学计算机考研复试上机真题 在线 oj 测评&#xff1a;https://app2098.acapp.acwing.com.cn/problem/list/ 字符串翻转 题目描述 给定一个字符串&#xf…

在Spring Boot项目中将中文转换为拼音:从入门到实践

文章目录 在Spring Boot项目中将中文转换为拼音&#xff1a;从入门到实践引言一、拼音转换的背景与需求1.1 拼音转换的应用场景1.2 技术选型 二、Spring Boot集成pinyin4j2.1 添加依赖2.2 创建拼音工具类2.3 在Spring Boot中使用工具类2.4 编写测试用例 三、实践中的注意事项3.…

React + TypeScript 实战:从零实现数据库连接与交互

React TypeScript 实战&#xff1a;从零实现数据库连接与数据交互 目录 技术选型与架构设计环境搭建与基础配置数据库连接实战场景 场景一&#xff1a;MSSQL 企业级应用连接场景二&#xff1a;MySQL 轻量级方案实现场景三&#xff1a;MongoDB NoSQL集成 TypeORM进阶&#xf…