理清缓存穿透、缓存击穿、缓存雪崩、缓存不一致的本质与解决方案

在构建高性能系统中,缓存(如Redis) 是不可或缺的关键组件,它大幅减轻了数据库压力、加快了响应速度。然而,在高并发环境下,缓存也可能带来一系列棘手的问题,如:缓存穿透、缓存击穿、缓存雪崩、缓存不一致

这些问题听起来名字相似,容易混淆。今天这篇文章,就带大家系统地理解它们的本质区别、发生场景及最佳实践方案


🧩 一图总览

问题类比本质场景是否打DB解决方案
缓存穿透故意找错门请求的是不存在的key用户请求id=-1✅ 每次布隆过滤器、空值缓存
缓存击穿热门商品钥匙丢了热点缓存突然失效秒杀详情失效瞬间访问量激增✅ 高并发打DB加锁、逻辑过期
缓存雪崩大楼停电大量缓存同时失效设置了相同TTL✅ 大规模打DB过期时间加随机值、限流
缓存不一致仓库和门市不同步缓存与数据库更新顺序错误先更新DB再删缓存,删失败✅ 数据错误先删缓存后更新、消息队列

1️⃣ 缓存穿透(Cache Penetration)

📌 本质

指的是请求的数据在缓存和数据库中都不存在,导致每次都穿透缓存打到数据库。

🎯 场景

  • 用户频繁访问不存在的 userId,如:userId = -1

  • 恶意攻击脚本请求随机字符串ID,绕过缓存打数据库

✅ 解决方案

  • 布隆过滤器:构建合法key集合,提前拦截非法请求

  • 空值缓存:对查询结果为空也做短期缓存,避免重复查询

    if (result == null) {redis.set(key, "null", 60); // 缓存空值1分钟
    }
    

2️⃣ 缓存击穿(Cache Breakdown)

📌 本质

某个热点数据在失效瞬间被高并发请求,造成短时间内大量请求直击数据库。

🎯 场景

  • 秒杀系统中某商品详情缓存5分钟,到期那一刻被数万用户请求。

✅ 解决方案

  • 互斥锁:只有一个线程可以查询DB并刷新缓存,其他等待

  • 逻辑过期:缓存中放入“过期时间”,即使过期,旧数据仍返回,由后台线程异步刷新缓存(常见于百度方案)


3️⃣ 缓存雪崩(Cache Avalanche)

📌 本质

大量缓存在同一时间过期,大量请求并发击穿缓存,压垮数据库。

🎯 场景

  • 代码里为所有缓存设置了固定TTL 30分钟,30分钟后集体过期。

✅ 解决方案

  • 过期时间加随机值,错开失效时间

    int ttl = 1800 + RandomUtils.nextInt(300); // 1800±300秒
    redis.set(key, value, ttl);
    
  • 预热缓存机制:启动时提前加载核心数据

  • 限流与熔断机制:保护后端服务


4️⃣ 缓存不一致(Cache Inconsistency)

📌 本质

缓存和数据库中的数据不一致,通常由于更新顺序或更新失败导致。

🎯 场景

  • 先更新数据库,再删除缓存,结果删除失败导致缓存是旧值。

  • 多线程并发写数据时,缓存更新被覆盖。

✅ 解决方案

  • 先删除缓存,再更新数据库(防止“读旧数据”)

  • 延迟双删策略:更新数据库后延迟再删一次缓存

    // 1. 删除缓存
    redis.del(key);// 2. 更新数据库
    db.update(data);// 3. 延迟再删(可用线程池延迟执行)
    Thread.sleep(1s);
    redis.del(key);
    
  • 消息队列异步更新缓存:更新后推送事件,由缓存服务更新


✅ 总结口诀

为了方便记忆,这里提供一句口诀:

穿透找不到,击穿太热闹,雪崩全失效,不一致顺序错。


📌 结语

缓存是提高系统性能的重要手段,但随之也带来了种种挑战。我们在设计系统时,应该对上述四种情况都有应对策略,避免因缓存问题造成服务雪崩、数据异常甚至系统崩溃。

欢迎收藏本篇文章,作为缓存容错设计的备查手册。🚀

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

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

相关文章

PyTorch_构建线性回归

使用 PyTorch 的 API 来手动构建一个线性回归的假设函数,数据加载器,损失函数,优化方法,绘制训练过程中的损失变化。 数据构建 import torch from sklearn.datasets import make_regression import matplotlib.pyplot as plt i…

005-nlohmann/json 基础方法-C++开源库108杰

《二、基础方法》:节点访问、值获取、显式 vs 隐式、异常处理、迭代器、类型检测、异常处理……一节课搞定C处理JSON数据85%的需求…… JSON 字段的简单类型包括:number、boolean、string 和 null(即空值);复杂类型则有…

HarmonyOS 5.0 分布式数据协同与跨设备同步​​

大家好,我是 V 哥。 使用 Mate 70有一段时间了,系统的丝滑使用起来那是爽得不要不要的,随着越来越多的应用适配,目前使用起来已经和4.3的兼容版本功能差异无碍了,还有些纯血鸿蒙独特的能力很是好用,比如&am…

Linux云计算训练营笔记day02(Linux、计算机网络、进制)

Linux 是一个操作系统 Linux版本 RedHat Rocky Linux CentOS7 Linux Ubuntu Linux Debian Linux Deepin Linux 登录用户 管理员 root a 普通用户 nsd a 打开终端 放大: ctrl shift 缩小: ctrl - 命令行提示符 [rootlocalhost ~]# ~ 家目录 /root 当前登录的用户…

macOS 安装了Docker Desktop版终端docker 命令没办法使用

macOS 安装了Docker Desktop版终端docker 命令没办法使用 1、检查Docker Desktop能否正常运行。 确保Docker Desktop能正常运行。 2、检查环境变量是否添加 1、添加环境变量 如果环境变量中没有包含Docker的路径,你可以手动添加。首先,找到Docker的…

Gradio全解20——Streaming:流式传输的多媒体应用(5)——基于WebRTC的摄像头实时目标检测

Gradio全解20——Streaming:流式传输的多媒体应用(5)——基于WebRTC的摄像头实时目标检测 本篇摘要20. Streaming:流式传输的多媒体应用20.5 基于WebRTC的摄像头实时目标检测20.5.1 环境配置及说明1. WebRTC2. TURN服务器 20.5.2 …

OSCP - Proving Grounds - NoName

主要知识点 linux命令注入SUID find提权 具体步骤 从nmap开始搜集信息,只开放了一个80端口 Nmap scan report for 192.168.171.15 Host is up (0.40s latency). Not shown: 65534 closed tcp ports (reset) PORT STATE SERVICE VERSION 80/tcp open http …

c++_csp-j算法 (6)_高精度算法(加减乘除)

高精度算法 C++高精度算法是指在C++编程语言中实现高精度计算的算法。在C++中,通常整数的范围是有限的,超出这个范围的整数计算会导致溢出。高精度算法的出现,使得C++程序能够处理超出常规整数范围的大整数计算,包括高精度加法、减法、乘法、除法等运算。 在C++中实现高精…

从OpenMP中的不兼容,窥探AI应用开发中的并行编程

在AI相关的项目开发中,偶然遇到下面这个问题: OMP: Error #15: Initializing libomp.dylib, but found libiomp5.dylib already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the progr am. That is dangerous, sin…

vue2+element实现Table表格嵌套输入框、选择器、日期选择器、表单弹出窗组件的行内编辑功能

vue2element实现Table表格嵌套输入框、选择器、日期选择器、表单弹出窗组件的行内编辑功能 文章目录 vue2element实现Table表格嵌套输入框、选择器、日期选择器、表单弹出窗组件的行内编辑功能前言一、准备工作二、行内编辑1.嵌入Input文本输入框1.1遇到问题1.文本框内容修改失…

c#OdbcDataReader的数据读取

先有如下c#示例代码: string strconnect "DSNcustom;UIDsa;PWD123456;" OdbcConnection odbc new OdbcConnection(strconnect); odbc.Open(); if (odbc.State ! System.Data.ConnectionState.Open) { return; } string strSql "select ID from my…

【HTML5】老式放映机原理-实现图片无缝滚动

老式放映机原理-实现图片无缝滚动 实现思路: 页面设计部分——先将视口div设置为相对定位,再视口div里面嵌套一个类似“胶卷”的div,把该div设置为绝对定位,此时“胶卷"会挂靠在视口上面,再将“胶卷”的left属性设置为负值…

LeetCode 1781. 所有子字符串美丽值之和 题解

示例 输入:s "aabcb" 输出:5 解释:美丽值不为零的字符串包括 ["aab","aabc","aabcb","abcb","bcb"] ,每一个字符串的美丽值都为 1这题光用文字解说还是无法达到讲…

2025ACTF Web部分题解

文章目录 ACTF uploadnot so web 1not so web 2 ACTF upload 前面登录随便输入可以进入文件上传页面, 随便上传一张图片, 发现路由存在file_path参数, 尝试路径穿越读取文件 发现可以成功读取 读取源码 /upload?file_path../app.pyimport uuid import os import hashlib im…

双目标清单——AI与思维模型【96】

一、定义 双目标清单思维模型是一种将决策或任务分解为两个主要目标,并分别列出相关要素和行动步骤的思维方式。这两个目标通常具有相互关联又有所侧重的特点,通过明确并列出与每个目标相关的具体事项,有助于更清晰地分析问题、制定计划和分…

深度学习系统学习系列【6】之深度学习技巧

文章目录 数据集准备数据集扩展数据预处理1. 0均值(Zero Centralization)代码实现 2. 归一化(Normalization)代码实现 3. 主成分分析(Principal Component Analysis, PCA)实现步骤代码实现 4. 白化&#xf…

rfsoc petalinux适配调试记录

1。安装虚拟机 2.设置共享文件夹 https://xinzhi.wenda.so.com/a/1668239544201149先设置文件夹路径 vmware 12 下安装 ubuntu 16.04 后,按往常的惯例安装 vmware-tools,安装时提示建议使用 open-vm-tools,于是放弃 vmware-tools 的安装&am…

# YOLOv1:开启实时目标检测的新时代

YOLOv1:开启实时目标检测的新时代 在计算机视觉领域,目标检测一直是研究的热点和难点问题。它不仅需要准确地识别出图像中的物体,还需要确定这些物体的位置。YOLO(You Only Look Once)系列算法以其高效的实时目标检测…

uni-app vue3 实现72小时倒计时功能

功能介绍 &#xff0c;数组项有一个下单时间 &#xff0c;比如今天下单在72小时内可以继续支付&#xff0c;超过则默认取消订单 页面按钮处 加上倒计时 <!-- 倒计时 --> <text v-if"item.timeLeft > 0">{{ formatTime(item.remaining) }}</text&g…

一周学会Pandas2 Python数据处理与分析-Pandas2数据类型转换操作

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Pandas 提供了灵活的方法来处理数据类型转换&#xff0c;以下是常见操作及代码示例&#xff1a; 1. 查看数据类型 …