分布式缓存:缓存设计中的 7 大经典问题_缓存失效、缓存穿透、缓存雪崩

文章目录

  • 缓存全景图
  • Pre
  • 缓存设计中的 7 大经典问题
  • 一、缓存失效
    • 1. 问题描述
    • 2. 原因分析
    • 3. 业务场景
    • 4. 解决方案
  • 二、缓存穿透
    • 1. 问题描述
    • 2. 原因分析
    • 3. 业务场景
    • 4. 解决方案
      • 缓存空结果
      • BloomFilter 过滤
        • BloomFilter 原理简述
  • 三、缓存雪崩
    • 1. 问题描述
    • 2. 原因分析
    • 3. 业务场景
    • 4. 解决方案
  • 四、结语

在这里插入图片描述


缓存全景图

在这里插入图片描述


Pre

分布式缓存:缓存设计三大核心思想

分布式缓存:缓存的三种读写模式及分类

分布式缓存:缓存架构设计的“四步走”方法

实际上,在缓存系统的设计架构中,还有很多坑, 如果设计不当会导致很多严重的后果。设计不当,轻则请求变慢、性能降低,重则会数据不一致、系统可用性降低,甚至会导致缓存雪崩,整个系统无法对外提供服务。


缓存设计中的 7 大经典问题

接下来将对缓存设计中的 7 大经典问题,

在这里插入图片描述

首先我们先梳理一下缓存失效、缓存穿透与缓存雪崩。

  1. 缓存失效:描述、原因、场景、解决方案
  2. 缓存穿透:描述、原因、场景、解决方案(含 BloomFilter 原理)
  3. 缓存雪崩:描述、原因、场景、解决方案

一、缓存失效

1. 问题描述

缓存第一个经典问题是缓存失效。上一课时讲到,服务系统查数据,首先会查缓存,如果缓存数据不存在,就进一步查 DB,最后查到数据后回种到缓存并返回。缓存的性能比 DB 高 50~100 倍以上,所以我们希望数据查询尽可能命中缓存,这样系统负荷最小,性能最佳。缓存里的数据存储基本上都是以 key 为索引进行存储和获取的。业务访问时,如果大量的 key 同时过期,很多缓存数据访问都会 miss,进而穿透到 DB,DB 的压力就会明显上升,由于 DB 的性能较差,只在缓存的 1%~2% 以下,这样请求的慢查率会明显上升。这就是缓存失效的问题。

当大量缓存 key 在同一时刻过期,被同时淘汰后,打到 DB 的请求骤增,数据库压力急剧上升,导致请求变慢甚至服务不可用。

2. 原因分析

  • 缓存在写入时通常带上固定过期时间。
  • 一批数据一次性加载到缓存,且使用相同的过期时间,必然在该时间点集中失效。

3. 业务场景

  • 火车票、机票开售时批量预加载缓存。
  • 微博后台离线计算完热门 Feed,一次性回写缓存。
  • 新业务上线或多IDC部署时的缓存预热。

4. 解决方案

在这里插入图片描述

  • 过期时间随机化实际过期 = 基础过期 + 随机值,让同类数据分散在一个窗口内逐步过期,避免雪崩式淘汰。
基础过期:3600s  
随机范围:0–300s  
最终过期:3600s + rand(0,300s)

二、缓存穿透

1. 问题描述

请求一个不存在的 key,每次都会 Miss 并打到 DB,若恶意或大量无效请求持续触发,DB 压力陡增,影响正常服务。

2. 原因分析

设计时只考虑了正常访问流程(Cache → DB → 回种),未对“查询空”场景做保护:对 DB 查询到的空结果不回写缓存,导致每次都要访问 DB。

3. 业务场景

  • 通过不存在的用户 ID、车次 ID 访问系统。
  • 恶意或误操作客户端批量请求非法 key。

4. 解决方案

在这里插入图片描述

缓存空结果

  • 第一次查询 DB 未命中时,回写一个特殊空值到缓存,并设置短过期时间;
  • 若后续仍查询该 key,则直接命中空值缓存,避免再次穿透。

BloomFilter 过滤

  • 预先用 BloomFilter 记录所有合法 key;
  • 查询时先检查 BloomFilter,不存在则直接返回,无需查 Cache/DB。
BloomFilter 原理简述

在这里插入图片描述

  1. 数据结构:一个位数组和 k 个独立 Hash 函数。

  2. 添加元素:对 key 做 k 次 Hash,设置对应 bit 位为 1。

  3. 检查存在:若 k 个位置都为 1,则“可能存在”;任一位置为 0,则“必定不存在”。

  4. 特性

    • 空否定 100% 准确;
    • 存在判断有一定误判率(可通过增加位数组和 Hash 函数数量降至可接受范围,如 1%→0.1%)。
    • 空值缓存与 BloomFilter 可结合使用,兼顾空间与准确率。

三、缓存雪崩

1. 问题描述

部分或大量缓存节点不可用,导致请求集中打到 DB 或重分布时过载,最终引发系统不可用。

  • 不支持 Rehash:节点故障后,客户端访问失败→穿透到 DB,DB 过载。
  • 支持 Rehash:节点故障后,流量重分发到健康节点,瞬间过载 → 多节点连锁宕机。

2. 原因分析

  • 单点或少量节点故障:未做好副本或限流保护。
  • 流量洪峰:热点 key 在少数节点集中,导致节点崩溃并连锁扩散。

3. 业务场景

  • 部分节点宕机并波及全池。
  • 机架断电引发大量节点脱机,瞬间请求涌向 DB。

4. 解决方案

在这里插入图片描述

  1. DB 读写降级开关

    • 监控到 DB 慢查询率或阻塞率过高时,Failfast 部分/全部读请求,保护 DB 可用;
    • 写请求保证优先处理,读请求可根据业务容忍度返回旧值或降级信息。
  2. 多副本部署

    • 同一数据在多副本(机架隔离)上缓存,任一副本失效可从其他副本读取;
    • 副本数根据热点程度,热点可配 6–10+ 副本,冷数据可少量双副本。
  3. 实时监控与自动故障转移

    • 缓存节点健康、命中率、慢请求比等指标告警;
    • 自动剔除异常节点、启动备用节点、限流降级,确保核心请求稳定处理。

四、结语

缓存系统的 稳定与高效 离不开对这些经典问题的深入理解与预防设计。

  • 失效雪崩:随机化过期、分散淘汰
  • 穿透攻防:空值回写、BloomFilter 过滤
  • 雪崩防护:限流降级、多副本、监控与自动化运维

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql差异备份与恢复

1.练习差异备份 差异备份:备份完全备份后,新产生的数据。 在192.168.88.50主机完成差异备份 步骤一:练习差异备份//周一完全备份 mysql> select * from test.one; --------------------- | name | age | sex | ------------------…

【Fargo】razor框架调用mediasoup的发送和接收能力

功能进行拆分,创建独立的发送和接收线程,并实现跨线程的数据传递。创建一个简化的主函数,展示如何使用这些新的接口线程隔离是通过包队列实现的,实际上可以用webrtc的post 跨线程机制? 需求 主要有两个需求:启动接收线程接收数据的接口 启动发送线程,但是数据来自于sim_…

C++——volatile

Cvolatile关键字 volatile是C中的一个关键字,用于修饰变量,表示该变量的值可能会在程序的控制之外被改变。它主要告诉编译器不要对这个变量进行优化,确保每次访问变量时都从实际存储位置读取最新值,而不是依赖寄存器中的缓存值。…

搭建自己的语音对话系统:开源 S2S 流水线深度解析与实战

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…

qt浏览文件支持惯性

#include <QApplication> #include <QListWidget> #include <QScroller> #include <QScrollerProperties>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建列表控件并添加示例项QListWidget listWidget;for (int i 0; i <…

路径规划算法BFS/Astar/HybridAstar简单实现

借鉴本文所述代码简单实现一下BFS&#xff0c;Astar和HybridAstar路径规划算法&#xff0c;用于辅助理解算法原理。 代码在这里&#xff0c;画图用到了matplotlibcpp库&#xff0c;需要先装一下&#xff0c;然后直接在文件目录下执行如下代码即可运行&#xff1a; mkdir build…

get_the_category() 和 get_the_terms() 的区别

get_the_category() 和 get_the_terms() 是WordPress中用于获取文章分类的两个函数&#xff0c;但它们之间存在一些关键差异&#xff1a; get_the_category() 特定于分类&#xff1a;get_the_category() 函数专门用于获取文章的分类(category)。它返回一个包含所有分类对象的…

RocketMq的消息类型及代码案例

RocketMQ 提供了多种消息类型&#xff0c;以满足不同业务场景对 顺序性、事务性、时效性 的要求。其核心设计思想是通过解耦 “消息传递模式” 与 “业务逻辑”&#xff0c;实现高性能、高可靠的分布式通信。 一、主要类型包括 普通消息&#xff08;基础类型&#xff09;顺序…

maxkey单点登录系统

github地址 https://github.com/MaxKeyTop/MaxKey/blob/master/README_zh.md 1、官方镜像 https://hub.docker.com/u/maxkeytop 2、MaxKey:Docker快速部署 参考地址&#xff1a; Docker部署 | MaxKey单点登录认证系统 拉取docker脚本MaxKey: Dromara &#x1f5dd;️MaxK…

基于AI生成测试用例的处理过程

基于AI生成测试用例的处理过程是一个结合机器学习、自然语言处理&#xff08;NLP&#xff09;和领域知识的系统性流程。以下是其核心步骤和关键技术细节&#xff0c;以帮助理解如何利用AI自动化生成高效、覆盖全面的测试用例。 1. 输入分析与需求建模 目标 将用户需求、系统文…

《Java vs Go vs C++ vs C:四门编程语言的深度对比》

引言​​ 从底层硬件操作到云端分布式系统&#xff0c;Java、Go、C 和 C 四门语言各自占据不同生态位。本文从​​设计哲学​​、​​语法范式​​、​​性能特性​​、​​应用场景​​等维度进行对比&#xff0c;为开发者提供技术选型参考。 一、​​设计哲学与历史定位​​…

无损提速黑科技:YOLOv8+OREPA卷积优化方案解析(原理推导/代码实现/调参技巧三合一)

文章目录 一、OREPA核心思想与创新突破1.1 传统重参数化的局限性1.2 OREPA的核心创新二、OREPA实现原理与数学推导2.1 卷积核分解策略2.2 动态融合公式三、YOLOv8集成实战(完整代码实现)3.1 OREPA卷积模块定义3.2 YOLOv8模型集成3.3 训练与推理配置四、性能对比与实验分析4.1…

RestTemplate 发送的字段第二个大写字母变成小写的问题探究

在使用RestTemplate 发送http 请求的时候&#xff0c;发现nDecisonVar 转换成了ndecisonVar ,但是打印日志用fastjson 打印的没有问题&#xff0c;换成jackson 打印就有问题。因为RestTemplate 默认使用的jackson 作为json 序列化方式&#xff0c;导致的问题&#xff0c;但是为…

C#核心概念解析:析构函数、readonly与this关键字

&#x1f50d; 析构函数&#xff1a;资源清理的最后防线 核心作用 析构函数&#xff08;~ClassName&#xff09;在对象销毁前执行&#xff0c;专用于释放非托管资源&#xff08;如文件句柄、非托管内存&#xff09;。托管资源&#xff08;如.NET对象&#xff09;由GC自动回收…

FFmpeg中使用Android Content协议打开文件设备

引言 随着Android 10引入的Scoped Storage&#xff08;分区存储&#xff09;机制&#xff0c;传统的文件访问方式发生了重大变化。FFmpeg作为强大的多媒体处理工具&#xff0c;也在不断适应Android平台的演进。本文将介绍如何在FFmpeg 7.0版本中使用Android content协议直接访…

vue——v-pre的使用

&#x1f530; 基础理解 ✅ 什么是 v-pre&#xff1f; v-pre 是一个跳过编译的 Vue 指令。 它告诉 Vue&#xff1a;“这个元素和其子元素中的内容不要被编译处理&#xff0c;按原样输出。” ✅ 使用场景&#xff1a; 展示原始的 Mustache 插值语法&#xff08;{{ xxx }}&a…

PyTorch中TensorBoardX模块与torch.utils.tensorboard模块的对比分析

文章目录 说明1. 模块起源与开发背景2. 功能特性对比3. 安装与依赖关系4. 性能与使用体验5. 迁移与兼容性策略6. 最佳实践与建议7. 未来展望8. 结论实际相关信息推荐资源 说明 TensorBoard&#xff1a;独立工具&#xff0c;只需安装tensorboard。TensorFlow&#xff1a;非必需…

单片机中断系统工作原理及定时器中断应用

文件目录 main.c #include <REGX52.H> #include "TIMER0.H" #include "KEY.H" #include "DELAY.H"//void Timer0_Init() { // TMOD 0x01; // TL0 64536 % 256; // TH0 64536 / 256; // ET0 1; // EA 1; // TR0 1; //}unsigned char…

Python爬虫实战:研究Portia框架相关技术

1. 引言 1.1 研究背景与意义 在大数据时代,网络数据已成为企业决策、学术研究和社会分析的重要资源。据 Statista 统计,2025 年全球数据总量将达到 175ZB,其中 80% 以上来自非结构化网络内容。如何高效获取并结构化这些数据,成为数据科学领域的关键挑战。 传统爬虫开发需…

【机器学习基础】机器学习与深度学习概述 算法入门指南

机器学习与深度学习概述 算法入门指南 一、引言&#xff1a;机器学习与深度学习&#xff08;一&#xff09;定义与区别&#xff08;二&#xff09;发展历程&#xff08;三&#xff09;应用场景 二、机器学习基础&#xff08;一&#xff09;监督学习&#xff08;二&#xff09;无…