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

1. 缓存雪崩(Cache Avalanche)

定义:
缓存雪崩指的是当缓存中大量的缓存数据在同一时间失效,导致大量的请求直接打到后端数据库,造成数据库压力剧增,甚至可能引起数据库崩溃。

发生原因:

  • 大量缓存的失效时间被设置得相同(例如,所有缓存的过期时间是固定的,或者是基于相同的时间点设置的)。
  • 短时间内大量的缓存数据失效,所有请求直接访问数据库,可能导致数据库短时间内的访问量急剧增加,造成数据库的压力暴增。

解决方案:

  • 缓存过期时间随机化:为不同缓存设置不同的过期时间,避免在同一时间点大量缓存失效。

    • 比如,缓存的过期时间可以在一个范围内随机化,比如 原定过期时间 ± 10分钟,以避免缓存失效集中在一个时间点。
  • 加锁机制:在缓存失效的情况下,通过互斥锁或分布式锁,确保只有一个请求去加载数据库数据,其他请求可以等待或者从缓存中获取之前加载的数据,避免缓存雪崩。

  • 热点数据提前缓存:对于一些热数据,提前设置较长的缓存时间或采取预加载机制,避免这些数据频繁过期。

2. 缓存击穿(Cache Breakdown)

定义:
缓存击穿是指某个热点数据的缓存失效,且此时有大量请求同时访问该数据,导致所有请求直接访问数据库,从而增加数据库压力,甚至可能引发数据库崩溃。

发生原因:

  • 缓存中的某个热点数据(如热门商品、热点文章等)失效,导致大量并发请求直接打到数据库。
  • 同时,缓存并没有及时重新加载数据,因此请求在短时间内直接访问数据库,给数据库造成压力。

解决方案:

  • 加锁机制:对于某些缓存失效的热点数据,可以通过加锁机制(如分布式锁)保证只有一个线程去查询数据库并重新加载缓存,其他线程等待加载完成后从缓存中获取数据。

  • 互斥锁:可以通过 Redis 的 SETNX 命令或者使用类似 Redisson 等分布式锁工具来确保同一时刻只有一个请求去更新缓存,防止缓存击穿。

  • 提前加载:对于一些热点数据,定期进行缓存预热,或者当缓存即将过期时,提前加载数据。

3. 缓存穿透(Cache Penetration)

定义:
缓存穿透是指查询一个根本不存在的数据,缓存中没有,数据库中也没有,导致每次查询都直接访问数据库。即使数据不存在,所有请求都会直接访问数据库,造成数据库的压力。

发生原因:

  • 请求的数据在缓存中没有,也不存在于数据库中,导致每次请求都会查询数据库,浪费资源。
  • 数据不存在时,缓存没有设置适当的空值缓存,导致每次请求都打到数据库。

解决方案:

  • 缓存空对象:当查询的数据不存在时,可以将空对象(例如 null 或一个特殊的标志对象)缓存一定时间。这样,下次再查询同样的数据时,就可以直接返回空对象,而不再查询数据库。

  • 布隆过滤器(Bloom Filter):使用布隆过滤器判断某个数据是否存在。如果某个数据在布隆过滤器中不存在,则可以直接返回,不再查询缓存和数据库。布隆过滤器可以减少对不存在数据的数据库访问。

  • 接口校验:加强接口的参数校验,避免恶意用户或无效请求访问缓存和数据库。

小结

  • 缓存雪崩:指大量缓存同一时刻失效,导致数据库压力暴增。可以通过缓存过期时间随机化、加锁等方式避免。
  • 缓存击穿:指热点数据的缓存失效,导致大量并发请求直接访问数据库。通过加锁、互斥锁、预加载等方式来避免。
  • 缓存穿透:指查询不存在的数据,导致每次请求都直接访问数据库。可以通过缓存空对象、布隆过滤器等方式来避免。

这三个问题通常在大规模分布式缓存系统中都会面临,设计时需要采取合适的策略来确保缓存系统的稳定性和高效性。

 

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

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

相关文章

瑞吉外卖项目学习笔记(十)修改套餐、删除套餐、起售和停售套餐

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…

Python 实时获取Linux服务器信息

在进行服务器监控、运维管理时,实时获取服务器信息至关重要。特别是在 Linux 环境下,我们常常需要获取系统的运行状态、资源占用情况以及硬件信息。如果你是运维人员、开发者或是正在做自动化运维任务的人,那么如何高效地实时获取 Linux 服务…

MATLAB程序转C# WPF,dll集成,混合编程

工作中遇到一个需求,有一部分算法的代码需要MATLAB来进行处理,而最后需要集成到C#中的wpf项目中去,选择灵活性更高的dll,去进行集成。(可以简单理解为:将MATLAB的函数,变为C#中类的函数成员&…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏,通过简单的交互逻辑,学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能: 数字选择:用户点击…

深入理解 pytest Fixture 方法及其应用

在 Python 自动化测试领域,pytest 是当之无愧的王者。提到 pytest,不得不说它的一大核心功能——Fixture。Fixture 的强大,让复杂的测试流程变得井井有条,让测试代码更加灵活和可复用。 那么,pytest 的 Fixture 究竟是…

【AI编辑器】Cursor与DeepSeek模型的集成:提升开发效率的新选择

目录 一、为什么选择DeepSeek模型 1.1 模型参数与训练 1.2 技术创新 1、FP8格式介绍 2、FP8混合精度训练的优势 3、FP8混合精度训练的技术要点 4、FP8混合精度训练的应用与挑战 1.3 性能表现 1.4 应用与部署 1.5 争议与前景 二、注册DeepSeek账号并获取API Key 三、…

什么情况会导致JVM退出?

大家好,我是锋哥。今天分享关于【什么情况会导致JVM退出?】面试题。希望对大家有帮助; 什么情况会导致JVM退出? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM(Java Virtual Machine)在不同情况下可能会退出&am…

软件工程实验-实验2 结构化分析与设计-总体设计和数据库设计

一、实验内容 1. 绘制工资支付系统的功能结构图和数据库 在系统设计阶段,要设计软件体系结构,即是确定软件系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。同时把模块组织成良好的层次系统:顶层模块通过调用它的下层…

《Rust权威指南》学习笔记(三)

泛型和trait 1.泛型可以提高代码的复用能力,泛型是具体类型或其他属性的抽象代替,可以看成是一种模版,一个占位符,编译器在编译时会将这些占位符替换成具体的类型,这个过程叫做“单态化”,所以使用泛型的…

计算机网络基础(7)中科大郑铨老师笔记

应用层 目标:  网络应用的 原理:网络应用协议的概念和实现方面 传输层的服务模型 客户-服务器模式 对等模式(peerto-peer) 内容分发网络  网络应用的 实例:互联网流行的应用层协 议  HTTP  FTP  SMTP / POP3 / IMAP  DNS…

2022浙江大学信号与系统笔记

原视频地址:2022浙江大学信号与系统(含配套课件和代码) - 胡浩基老师-哔哩哔哩 ⭐⭐⭐ 我的笔记:飞书链接 - 信号与系统 基于视频,记得笔记,加了点自己的补充(有的是问 ChatGPT 的)…

数学建模入门——建模流程

摘要:本文介绍了数学建模的一般流程概述。 目录 一、前言 二、数据预处理 三、描述性统计分析 四、模型建立 五、模型评价 一、前言 本文将为想要入门数学建模的同学讲述数学建模的一般流程。但数学建模流程并非一成不变。虽有大致步骤,像分析问题、…

如何使用OpenCV进行抓图-多线程

前言 需求: 1、如何使用OpenCV捕抓Windows电脑上USB摄像头的流、 2、采用多线程 3、获知当前摄像头的帧率。 这个需求,之前就有做了,但是由于出现了一个问题,人家摄像头的帧率目前都可以达到60帧/s 了,而我的程序…

NLP CH3复习

CH3 3.1 几种损失函数 3.2 激活函数性质 3.3 哪几种激活函数会发生梯度消失 3.4 为什么会梯度消失 3.5 如何解决梯度消失和过拟合 3.6 梯度下降的区别 3.6.1 梯度下降(GD) 全批量:在每次迭代中使用全部数据来计算损失函数的梯度。计算成本…

01 数据分析介绍及工具准备

数据分析介绍及工具准备 一、工具准备二、下载和使用Anaconda三、jupyter notebook常用快捷键 一、工具准备 数据科学库 NumPy,SciPy,Pandas,Scikit-Learn 数据可视化库 Matplotlib,Seaborn 编译器 Jupyter Notebook 数据科…

机组的概述

计算机系统组成 硬件系统和软件系统 计算机硬件 1.冯诺依曼机基本思想 特点 1.采用“存储程序”工作方式 2.硬件系统由运算器,存储器,控制器,输入输出设备组成 3.指令和数据存在存储器中,形式无区别 4.指令和数据用二进制代…

Windows应用开发-解析MP4视频文件(第1部分)

下载本应用 本Windows应用解析MP4视频文件,以表格的方式显示MP4文件结构。并可以将结果保存到bmp图片。 使用方法 选择“打开MP4视频文件”菜单项,打开MP4文件,就可以获得如下图像: box的每一项,用3个矩形表示&…

Scala_【4】流程控制

第四章 分支控制if-else单分支双分支多分支返回值嵌套分支 For循环控制包含边界不包含边界循环守卫循环步长嵌套循环循环返回值 While循环Break友情链接 分支控制if-else 单分支 双分支 多分支 返回值 嵌套分支 For循环控制 Scala也为for循环这一常见的控制结构提供了非常多的…

电商Google广告:2025年提升转化率的5种策略

展望 2025 年,Google 广告领域将迎来一系列显著变化,这些趋势对于提升广告转化率至关重要,值得我们提前关注与布局。 智能化程度持续加深,用户搜索习惯愈发精细,广告格式推陈出新,视频广告势头正猛...那么…

一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理

文章目录 一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理1.TCP建立连接需要3次握手1.1 先讲个你兄弟的故事1.2 TCP 3次握手1.2 TCP 3次握手8件事1.3 TCP握手能不能是两次 2. TCP 断开连接要4次挥手2.1 还回到你兄弟的故事上2.2 TCP 4次挥手2.2 TCP4次挥手4件事2…