缓存常见问题:缓存穿透、缓存雪崩以及缓存击穿

news2025/5/31 17:28:18

缓存常见问题

一、缓存穿透 (Cache Penetration)

是什么

缓存穿透是指客户端持续请求一个缓存和数据库中都根本不存在的数据。这导致每次请求都会先查缓存(未命中),然后穿透到数据库查询(也未命中)。如果这类请求量很大(比如恶意攻击,或者程序逻辑缺陷导致查询不存在的ID),就会给数据库带来巨大压力,因为每次查询都是无效的。

解决方法

  1. 缓存空值 (Cache Null Values) :
    • 当数据库查询未找到数据时,仍然在缓存中存储一个特殊标记(如null或特定字符串),并为其设置一个较短的过期时间(如1-5分钟)。这样后续对同一不存在数据的请求会命中缓存中的这个“空标记”,直接返回,避免了再次查询数据库。
  2. 布隆过滤器 (Bloom Filter) фильтр:
    • 在访问缓存和数据库之前,使用布隆过滤器预先判断请求的数据是否存在。布隆过滤器可以高效地判断一个元素“一定不存在”或“可能存在”。
    • 如果布隆过滤器判断数据不存在,则直接返回,不查询缓存和数据库,能拦截大部分对不存在数据的无效请求。
    • 需要注意布隆过滤器的误判率,以及数据写入时需要同步更新布隆过滤器。
  3. 接口层增加校验:
    • 对请求参数进行合法性校验,如用户鉴权、数据格式校验、ID范围校验等,对于不合法的请求直接拦截。

二、缓存雪崩 (Cache Avalanche)

是什么

缓存雪崩是指在短时间内,缓存中的大量Key几乎在同一时刻集中过期失效,或者缓存服务本身(如Redis集群)发生故障宕机。这两种情况都会导致原本由缓存处理的大量并发请求,在缓存失效后,瞬间直接涌向数据库,可能导致数据库压力剧增甚至崩溃。

解决方法

  1. 设置随机过期时间 (Randomized Expiration Times) :
    • 在基础过期时间上增加一个随机的偏移量(例如,过期时间 = 固定时间 + random(0, 300)秒)。这样可以避免大量Key在同一精确时刻集中失效,将过期时间点打散。
  2. 多级缓存 (Multi-level Cache) :
    • 使用例如Nginx/OpenResty的本地缓存 + Redis分布式缓存 + 数据库的架构。即使Redis层发生雪崩,前置的本地缓存也能挡住一部分流量。
  3. 服务熔断与限流 (Circuit Breaking & Rate Limiting) :
    • 当检测到数据库访问压力过大或响应缓慢时,通过熔断机制(如Sentinel, Hystrix)暂时阻止对数据库的进一步请求,直接返回降级响应(如预设的默认值或提示信息),保护数据库。
      限流则控制单位时间内访问数据库的请求数量。
  4. 保证缓存服务高可用 (High Availability for Cache Service) :
    • 对于Redis等缓存服务,搭建集群(如Redis Sentinel、Redis Cluster)或使用云服务商提供的高可用缓存服务,确保缓存服务不会轻易整体宕机。
  5. 数据预热 (Data Preheating) :
    • 在系统启动或低峰期,提前将热点数据加载到缓存中,并设置合理的过期策略。

三、缓存击穿 (Cache Breakdown / Hotspot Key Problem)

是什么

缓存击穿,也常被称为热点Key问题。它指的是某一个访问非常频繁的热点数据Key,在其对应的缓存失效的瞬间,大量针对该特定Key的并发请求同时涌入。由于缓存未命中,这些并发请求会全部直接打到数据库上查询这同一个数据,对数据库单点造成巨大压力,就像把缓存“击穿”了一个洞。

解决方法

  1. 互斥锁/分布式锁 (Mutex Lock / Distributed Lock) :
    • 当缓存未命中时,只允许一个请求线程获取锁去查询数据库并将结果写入缓存。其他线程则等待(可以设置自旋、休眠后重试,或直接返回特定提示)。一旦持有锁的线程更新了缓存并释放锁,后续请求就能从缓存获取数据。
    • 在分布式环境下,需要使用分布式锁(如基于Redis的Redisson,或基于ZooKeeper)。
    • 这是最常用的解决方案,能有效防止对数据库的并发冲击。
  2. 热点数据永不过期 (或逻辑过期) (Never Expire Hot Data / Logical Expiration) :
    • 物理永不过期:对于访问量极大且数据相对稳定的热点Key,可以考虑不设置物理过期时间,数据的更新通过后台任务主动刷新或消息通知机制来更新缓存。
    • 逻辑过期:缓存数据本身不设置TTL(或设置很长)。在缓存值中额外存储一个逻辑过期时间字段。当查询缓存命中后,判断逻辑过期时间:
      • 未过期:直接返回。
      • 已过期:启动一个异步线程去更新缓存(此过程可加锁防止并发更新),当前请求可以先返回旧数据(如果业务允许),或者等待异步更新完成。
  3. 二级缓存/本地缓存:
    • 对于极热点的数据,除了分布式缓存,还可以在应用服务器内部署本地缓存(如Caffeine, Guava Cache),降低对分布式缓存的压力,进一步减少击穿到数据库的可能性。

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

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

相关文章

纤维组织效应偏斜如何影响您的高速设计

随着比特率继续飙升,光纤编织效应 (FWE) 偏移,也称为玻璃编织偏移 (GWS),正变得越来越成为一个问题。今天的 56GB/s 是高速路由器中最先进的,而 112 GB/s 指日可待。而用于个人计算机…

Rust使用Cargo构建项目

文章目录 你好,Cargo!验证Cargo安装使用Cargo创建项目新建项目配置文件解析默认代码结构 Cargo工作流常用命令速查表详细使用说明1. 编译项目2. 运行程序3.快速检查4. 发布版本构建 Cargo的设计哲学约定优于配置工程化优势 开发建议1. 新项目初始化​2. …

Python训练营打卡Day39

DAY 39 图像数据与显存 知识点回顾 1.图像数据的格式:灰度和彩色数据 2.模型的定义 3.显存占用的4种地方 a.模型参数梯度参数 b.优化器参数 c.数据批量所占显存 d.神经元输出中间状态 4.batchisize和训练的关系 作业:今日代码较少,理解内容…

UE5蓝图中播放背景音乐和使用代码播放声音

UE5蓝图中播放背景音乐 1.创建背景音乐Cube 2.勾选looping 循环播放背景音乐 3.在关卡蓝图中 Event BeginPlay-PlaySound2D Sound选择自己创建的Bgm_Cube 蓝图播放声音方法二: 使用代码播放声音方法一 .h文件中 头文件引用 #include "Kismet/GameplayS…

AI 赋能数据可视化:漏斗图制作的创新攻略

在数据可视化的广阔天地里,漏斗图以其独特的形状和强大的功能,成为展示流程转化、分析数据变化的得力助手。传统绘制漏斗图的方式往往需要耗费大量时间和精力,对使用者的绘图技能和软件操作熟练度要求颇高。但随着技术的蓬勃发展,…

用 Python 模拟下雨效果

用 Python 模拟下雨效果 雨天别有一番浪漫情怀:淅淅沥沥的雨滴、湿润的空气、朦胧的光影……在屏幕上也能感受下雨的美妙。本文将带你用一份简单的 Python 脚本,手把手实现「下雨效果」动画。文章深入浅出,零基础也能快速上手,完…

C#对象集合去重的一种方式

前言 现在AI越来越强大了,有很多问题其实不需要在去各个网站上查了,直接问AI就好了,但是呢,AI给的代码可能能用,也可能需要调整,但是自己肯定是要会的,所以还是总结一下吧。 问题 如果有一个…

在ROS2(humble)+Gazebo+rqt下,实时显示仿真无人机的相机图像

文章目录 前言一、版本检查检查ROS2版本 二、步骤1.下载对应版本的PX4(1)检查PX4版本(2)修改文件名(3)下载正确的PX4版本 2.下载对应版本的Gazebo(1)检查Gazebo版本(2)卸载不正确的Gazebo版本(3)下载正确的Gazebo版本 3.安装bridge包4.启动 总结 前言 在ROS2的环境下&#xff…

github双重认证怎么做

引言 好久没登陆github了, 今天登陆github后,提醒进行2FA认证。 查看了github通知,自 2023 年 3 月起,GitHub 要求所有在 GitHub.com 上贡献代码的用户启用一种或多种形式的双重身份验证 (2FA)。 假如你也遇到这个问题&#xf…

数据的类型——认识你的数据

第02篇:数据的类型——认识你的数据 写在前面:嗨,大家好!我是蓝皮怪。在上一篇文章中,我们聊了统计学的基本概念,今天我们来深入了解一个非常重要的话题——数据的类型。你可能会想:"数据就…

第五十二节:增强现实基础-简单 AR 应用实现

引言 增强现实(Augmented Reality, AR)是一种将虚拟信息叠加到真实世界的技术,广泛应用于游戏、教育、工业维护等领域。与传统虚拟现实(VR)不同,AR强调虚实结合,用户无需完全沉浸到虚拟环境中。本文将通过Python和OpenCV库,从零开始实现一个基础的AR应用:在检测到特定…

LLaMaFactory 微调QwenCoder模型

步骤一:准备LLamaFactory环境 首先,让我们尝试使用github的方式克隆仓库: git config --global http.sslVerify false && git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git # 创建新环境,指定 Python 版本(以 3.…

【最新版】Arduino IDE的安装入门Demo

1、背景说明 1、本教程编写日期为2025-5-24 2、Arduino IDE的版本为:Arduino IDE 2.3.6 3、使用的Arduino为Arduino Uno 1、ArduinoIDE的安装 1、下载。网址如下:官网 2、然后一路安装即可。 期间会默认安装相关驱动,默认安装即可。 3、安…

不起火,不爆炸,高速摄像机、数字图像相关DIC技术在动力电池新国标安全性能测试中的应用

2026年7月1日,我国将正式实施GB38031-2025《电动汽车用动力蓄电池安全要求》——这项被称为“史上最严电池安全令”的新国标,首次将“热失控不蔓延、不起火、不爆炸”从企业技术储备上升为强制性要求,标志着电池安全进入“零容忍”时代&#…

thinkadmin中使用layui日期选择器,数据库存储时间戳

form.html <div class="layui-form-item label-required-prev" id="jiezhi_time-div">

WSL中ubuntu通过Windows带代理访问github

WSL中ubuntu通过Windows带代理访问github 前言: WSL是Windows下的ubuntu访问工具&#xff0c;目前无法访问外网&#xff0c;因此需要配置一下。 步骤一 代理中进行如下设置: 步骤二 ubuntu22.04中修改配置 使用如下命令获取IP地址&#xff1a; ip route | grep default | aw…

RISC-V特权模式及切换

1 RISC-V特权模式基本概念 1.1 RISC-V特权模式介绍 RISC-V 指令集架构&#xff08;ISA&#xff09;采用多特权级别设计作为其核心安全机制&#xff0c;通过层次化的权限管理实现系统资源的隔离与保护。该架构明确定义了四个层次化的特权模式&#xff0c;按照权限等级由高至低…

【深度学习】11. Transformer解析: Self-Attention、ELMo、Bert、GPT

Transformer 神经网络 Self-Attention 的提出动机 传统的循环神经网络&#xff08;RNN&#xff09;处理序列信息依赖时间步的先后顺序&#xff0c;无法并行&#xff0c;而且在捕捉长距离依赖关系时存在明显困难。为了解决这些问题&#xff0c;Transformer 引入了 Self-Attent…

4060显卡什么水平 4060显卡参数介绍

NVIDIA的GeForce RTX 40系列显卡基于最新的Ada Lovelace架构&#xff0c;提供了前所未有的图形处理能力和效率。其中&#xff0c;RTX 4060定位中高端市场&#xff0c;针对那些寻求卓越性能同时又注重成本效益的用户群体。那么&#xff0c;4060显卡什么水平呢&#xff1f;本文将…

技术为器,服务为本:AI时代的客服价值重构

在智能化浪潮中&#xff0c;大语言模型的出现为客户服务行业注入了全新动能。然而技术创新的价值不在于技术本身&#xff0c;而在于其赋能服务的深度与广度。AI对于我们来说&#xff0c;如同发动机之于汽车&#xff0c;重要的不是引擎参数&#xff0c;而是整车带给用户的驾驶体…