当前位置: 首页 > news >正文

非关系型数据库 八股文 Redis相关 缓存雪崩 击穿 穿透

目录

缓存雪崩

大量数据同时过期解决方案

也有可能是 Redis 挂了 故障

缓存击穿

用互斥锁解决

热点数据永远不过期

缓存穿透 重点

可能的原因

限制 请求的 访问

缓存空值或者默认值

布隆过滤器(重要)

总结

参考资料


缓存雪崩

缓存雪崩是指大量缓存数据同时过期

所以我们通常会给 redis 里面的数据随机化过期时间 当缓存数据过期后 用户请求数据 数据不在缓存里 就会重新生成缓存 后续的请求就能直接访问缓存

如果数据大规模过期 用户请求就会全去 mysql mysql 承受不了就会宕机 进而导致整个系统崩溃

redis 故障也会导致缓存雪崩

大量请求也会到 mysql 去

大量数据同时过期解决方案

  1. 随机化过期时间

设置缓存数据过期时间随机 用 伪随机数 设置时间

  1. 互斥锁

互斥锁 这个做法是如果发现 redis 没有数据 加一个互斥锁 则在同一时间内 只让一个线程去构建缓存 这样就不用所有请求都到 mysql 了 当这个线程构建缓存结束后 释放锁 其他线程的请求此时就会进来 获取新的缓存

  1. 异步处理

可以让缓存一直存在 即使过期了 也很快更新 我们可以设置一个定时任务 在后台检测缓存是否存在 如果不存在则更新 尽量保证每次用户访问数据的时候 缓存都是存在的 同样的我们也可以使用消息队列 业务线程发现缓存失效 通过消息队列发一条消息通知后台线程更新缓存

  1. 缓存预热

我们在业务上线的时候 最好进行缓存预热 先把缓存加载起来

也有可能是 Redis 挂了 故障

  1. 服务熔断 请求限流

redis 挂了则直接返回错误 不要访问数据库 但这样会让业务无法工作

限流也可以 请求太多了就直接拒绝服务 直到正常

  1. 构建集群

构建 redis 集群

缓存击穿

假设我们有热点数据

在高并发场景下获取热点数据

热点数据过期的一瞬间 大量高并发请求会直接到 mysql

然后系统就挂了

我感觉缓存击穿是缓存雪崩的一个子集

用互斥锁解决

还是在业务线程请求数据的时候 如果发现缓存里没有数据 就加上互斥锁 保证此时间只有业务线程去数据库获取数据再回来更新缓存 然后释放锁 让其他线程去拿缓存里的数据

如果未能拿到互斥锁的请求 要不返回空值 要不继续等

热点数据永远不过期

永不过期

如果数据库数据更新了再通知缓存

可以用消息队列实现

缓存穿透 重点

之前我们说的是 缓存雪崩 缓存击穿 这两种情况

那么说明还是有数据的 我们只是要求缓存恢复相对应的数据 即可正常运行

但是如果 数据库没有数据 缓存也没有数据

后续的请求依旧会全部到达缓存 导致数据库压力骤增

为什么会存在 数据库中也没有数据 缓存中也没有数据这种情况呢

可能的原因

  1. 业务误操作 删掉了 mysql 和缓存里面的数据
  2. 黑客恶意攻击 特地访问不存在的数据

限制 请求的 访问

在 API 的入口处我们要判断请求参数是否合理

请求参数是否包含非法值 是否存在

让恶意请求不会到达数据库和缓存 直接被拦截

缓存空值或者默认值

当我们线上业务发现存在缓存穿透

可以在缓存里面提前设置一个空值或者是默认值

这样后续请求到达缓存的时候就能读取空值或者默认值 返回给应用

而不会继续查询数据库

布隆过滤器(重要)

布隆过滤器是一个位数组

通过 k 个函数对数据进行哈希计算

得到 k 个结果

然后将结果作为索引

将对应索引处的值标记为 1

数据传入同样是进行 k 个哈希运算

如果这 k 个位置的数值都是 1 那么表示数据已经出现过了

布隆过滤器主要反馈的是两个信息

  1. 数据可能出现过 (因为可能会存在哈希冲突)
  2. 数据一定没有出现

布隆过滤器说数据存在 可能存在 也可能不存在

但是布隆过滤器说数据不存在 那就是不存在

进入缓存查数据的时候 在要进入数据库查询数据返回更新缓存的时候 我们可以使用布隆过滤器查看数据库中是否存在数据

总结

参考资料

什么是缓存雪崩、击穿、穿透? | 小林coding

相关文章:

非关系型数据库 八股文 Redis相关 缓存雪崩 击穿 穿透

目录 图 缓存雪崩 大量数据同时过期解决方案 也有可能是 Redis 挂了 故障 缓存击穿 用互斥锁解决 热点数据永远不过期 缓存穿透 重点 可能的原因 限制 请求的 访问 缓存空值或者默认值 布隆过滤器(重要) 总结 参考资料 图 缓存雪崩 缓存雪崩是指大量缓存数据同时…...

uniapp自定义拖拽排列

uniapp自定义拖拽排列并改变下标 <!-- 页面模板 --> <template><view class"container"><view v-for"(item, index) in list" :key"item.id" class"drag-item" :style"{transform: translate(${activeInde…...

汽车免拆诊断案例 | 2013款大众辉腾车发动机抖动

故障现象  一辆2013款大众辉腾车&#xff0c;搭载CMV发动机&#xff08;燃油喷射方式为缸内直喷&#xff09;&#xff0c;累计行驶里程约为21.8万km。该车发动机怠速、加速时均有抖动&#xff0c;且组合仪表上的发动机故障灯异常点亮。 故障诊断 用故障检测仪检测&#xff0…...

【氮化镓】同质结GaN PiN二极管的重离子单粒子烧毁SEB

2025 年,范德堡大学的 A. S. Senarath 等人通过实验研究的方法,深入探究了在同质结 GaN 垂直 PIN 二极管中,边缘终止设计对重离子诱发的单粒子漏电(SELC)和单粒子烧毁(SEB)的影响。该研究获得了多个美国军方机构的支持,包括空军卓越辐射效应中心、海军研究办公室、能源…...

Java基础 4.23

1.包的命名 命名规则 只能包含数字 字母 下划线 小圆点 但不能用数字开头 不能是关键字或保留字 命名规范 一般是小写字母小圆点 一般是 com.公司名.项目名.业务模块名 比如 com.sina.crm.user 用户模块com.sina.crm.order 订单模块com.sina.crm.utils 工具类 2.常用的包…...

【学习准备】算法和开发知识大纲

1 缘起 今年&#xff08;2025年&#xff09;的职业升级结果&#xff1a;不通过。没办法升职加薪了。 需要开始完善学习&#xff0c;以应对不同的发展趋势&#xff0c;为了督促自己学习&#xff0c;梳理出相关学习大纲。 分为算法和开发两部分。 算法&#xff0c;包括基础算法和…...

Godot学习-3D基本环境设置以及3D角色移动

文章目录 一、新建项目和导入资产二、创建玩家场景1.修改模型节点类型为CharacterBody3D2.添加碰撞对象并且设置碰撞区域3.根据动画的运动状态调整碰撞区域 三、使用CSGMesh3D创建地面1.设置网格尺寸2.设置网格材质 四、添加3D相机和光照五、为角色移动编写代码1.基本移动和旋转…...

高效并发编程:无锁编程

无锁编程是一种并发编程的技术&#xff0c;旨在避免使用传统的锁机制来保护共享数据。相比有锁编程&#xff0c;无锁编程可以提供更高的并发性能和可伸缩性。在无锁编程中&#xff0c;线程或进程通过使用原子操作、CAS&#xff08;Compare-and-Swap&#xff09;等技术来实现对共…...

Java与C语言核心差异:从指针到内存管理的全面剖析

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;AI 【前言】 在计算机编程领域&#xff0c;Java和C语言都是极具影响力的编程语言。Java以其跨平台性、安全性和面向对象…...

亚远景-基于ASPICE标准的汽车软件过程优化路径

基于ASPICE标准的汽车软件过程优化路径可以从以下几个方面展开&#xff1a; 1. 评估现状与设定目标 评估现状 &#xff1a;企业需要对当前的软件开发过程进行全面评估&#xff0c;识别与ASPICE标准之间的差距&#xff0c;明确薄弱环节。 设定目标 &#xff1a;根据评估结果和…...

集结号海螺捕鱼游戏源码解析(第三篇):拉霸机模块开发详解与服务器开奖机制

本篇聚焦“拉霸机”子游戏模块&#xff0c;全面剖析客户端滚轮动画机制、服务端中奖算法、中奖广播同步与配置解析方式&#xff0c;适用于技术团队针对拉霸玩法的二次开发与稳定性优化。 一、模块目录结构说明 拉霸机模块的源码目录一般如下&#xff1a; 子游戏/slot_machine…...

图聚类中的亲和力传播

图中展示的是Affinity Propagation&#xff08;亲和力传播&#xff09;算法中的一个关键步骤——更新吸引度矩阵。Affinity Propagation是一种聚类算法&#xff0c;它通过消息传递的方式找到数据集中的代表性样本&#xff08;称为exemplar或原型&#xff09;&#xff0c;并将其…...

Apache中间件解析漏洞与安全加固

Apache作为全球使用最广泛的Web服务器&#xff0c;其灵活性和模块化设计使其成为开发者的首选。然而&#xff0c;其解析机制和配置不当可能导致严重的安全风险。本文将从​​漏洞原理​​、​​攻击案例​​和​​安全配置​​三个维度&#xff0c;结合真实场景&#xff0c;解析…...

MyBatis-Plus分页插件的使用

从MyBatis-Plus 3.4.0开始&#xff0c;不再使用旧版本的PaginationInterceptor &#xff0c;而是使用MybatisPlusInterceptor。 下面是MyBatis-Plus 3.4.3.3新版分页的使用方法。 配置 使用分页插件需要配置MybatisPlusInterceptor&#xff0c;将分页拦截器添加进来&#xff…...

集结号海螺捕鱼游戏源码解析(第二篇):水浒传捕鱼模块逻辑与服务器帧同步详解

本篇将全面解构“水浒传”子游戏的服务端核心逻辑、帧同步机制、鱼群刷新规则、客户端命中表现与服务器计算之间的协同方式&#xff0c;聚焦于 C 与 Unity3D 跨端同步的真实实现过程。 一、水浒传捕鱼模块资源结构 该模块包含三部分核心目录&#xff1a; 子游戏/game_shuihuz…...

开发体育直播系统后台权限设计实践分享|ThinkPHP 技术栈落地案例

今天我们分享的是一套由 东莞梦幻网络科技 自研的体育直播源码&#xff0c;在 ThinkPHP MySQL 技术栈的加持下&#xff0c;后台权限系统如何从0到1落地&#xff0c;并支撑整个平台稳定运行。 一、整体架构设计 用户端&#xff08;APP / H5 / PC&#xff09;↓ 前端接口层&am…...

onlyoffice历史版本功能实现,版本恢复功能,编辑器功能实现 springboot+vue2

文章目录 oonlyoffice历史版本功能实现 &#xff08;编辑器功能实现&#xff09;springbootvue2前提 需要注意把这个 (改成自己服务器的ip或者域名) 改成 自己服务器的域名或者地址1. onloyoffice 服务器部署 搜索其他文章2. 前段代码 vue 22.1 需要注意把这个 (改成自己服务器…...

【漫话机器学习系列】219.支持向量机分类器(Support Vector Classifier)

图解支持向量机分类器&#xff08;Support Vector Classifier&#xff09; 在机器学习的分类模型中&#xff0c;支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种功能强大且广泛应用的监督学习算法。它尤其擅长解决小样本、高维度的数据问题&a…...

深入解析 Spring Boot Test:架构、核心组件与最佳实践

深入解析 Spring Boot Test&#xff1a;架构、核心组件与最佳实践 在现代软件开发中&#xff0c;测试是确保应用程序质量的关键环节。Spring Boot Test作为Spring Boot框架的一部分&#xff0c;提供了一套强大且灵活的测试工具&#xff0c;帮助开发者高效地测试Spring Boot应用…...

Sklearn 与 TensorFlow 机器学习实用指南-第八章 降维-笔记

补充&#xff1a; 本文是关于《Sklearn 与 TensorFlow 机器学习实用指南》的学习笔记&#xff0c;基于八、降维 - 【布客】Sklearn 与 TensorFlow 机器学习实用指南 第二版&#xff0c;感谢译者 本文和原文的区别&#xff1a; 本文会更精简、系统地表述书中概念&#xff0c;…...

动态贴纸+美颜SDK的融合实现:底层架构与性能优化技术全解析

如今&#xff0c;美颜动态贴纸功能已经成为提升用户粘性与平台竞争力的“标配”。但从技术实现角度看&#xff0c;如何高效融合动态贴纸与美颜SDK&#xff0c;并在保证画质与流畅度的前提下实现稳定输出&#xff0c;仍然是一项复杂且极具挑战的工程。 本文将深入解析“动态贴纸…...

Git简介与入门

Git的发明 Git由著名的Linux创始人linus于2005年发明&#xff08;所以git的界面、使用方式与Linux挺像的&#xff0c;即命令行方式&#xff09; 经过发展&#xff0c;现在广泛应用于代码管理与团队协作。 Git特性 Git是分布式版本控制系统 分布式 每个开发者拥有完整仓库&…...

车载信息安全架构 --- 汽车网络安全

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

Elasticsearch 堆内存使用情况和 JVM 垃圾回收

作者&#xff1a;来自 Elastic Kofi Bartlett 探索 Elasticsearch 堆内存使用情况和 JVM 垃圾回收&#xff0c;包括最佳实践以及在堆内存使用过高或 JVM 性能不佳时的解决方法。 堆内存大小是分配给 Elasticsearch 节点中 Java 虚拟机的 RAM 数量。 从 7.11 版本开始&#xff…...

基于UDP协议的群聊服务器开发(C/C++)

目录 服务器 一、通信 打开网络文件 绑定IP地址与端口号 接收信息 二、数据处理 客户端 三、端口绑定 四、收发信息 五、源码 服务器 在服务器架构设计中&#xff0c;模块解耦是保障系统可维护性的核心准则。本方案采用分层架构将核心功能拆解为通信层与业务处理层两…...

通过自定义序列化来格式化BigDecimal带千分符的字符串

首先&#xff0c;你需要创建一个自定义的 JsonSerializer 来格式化 BigDecimal 为带千分符的字符串。 public class BigDecimalWithCommaSerializer extends JsonSerializer<BigDecimal> {Overridepublic void serialize(BigDecimal value, JsonGenerator gen, Serialize…...

VulnHub-DarkHole_2靶机渗透教程

1.靶机部署 [Onepanda] Mik1ysomething 靶机下载&#xff1a;https://download.vulnhub.com/darkhole/darkhole_2.zip 直接使用VMware导入打开就行 注意&#xff1a;靶机的网络连接模式必须和kali一样&#xff0c;让靶机跟kali处于同一网段&#xff0c;这样kali才能扫出靶机…...

cf | Common Multiple

题目&#xff1a; 代码&#xff1a; 无注释版&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long signed main(){int t;cin>>t;while(t--){int n;cin>>n;map<int,int> mp;mp.clear();for(int i1;i<n;i){int x;cin…...

leetcode hot100尝试1

目录 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 c m…...

大模型Agent

一 大模型Agent是什么 &#xff08;一&#xff09;大模型Agent是指基于大语言模型的&#xff0c;能使用工具与外部世界进行交互的计算机程序 感知&#xff08;Perception&#xff09;&#xff1a; ● 家庭助理通过摄像头、麦克风、传感器等设备获取家庭成员的活动信息和环境状…...

阻塞队列的介绍和简单实现——多线程编程简单案例[多线程编程篇(4)]

目录 前言 阻塞队列 阻塞队列相比普通队列的优势 1.天然线程安全 2.实现生产者-消费者模型更加简单 3.自动等待与唤醒 生产者-消费者模型 JAVA标准库中的阻塞队列 阻塞队列的简单实现 前言 在现代软件开发中&#xff0c;多线程编程能力已经成为程序员必须掌握的一项核心…...

服务器配置环境-condapytorch_20250422

文章目录 前言一、conda环境1.1 创建固定python版本的conda环境1.2 激活 Conda 环境1.3 关闭 Conda 环境 二、版本查看CUDA版本当电脑里有多个CUDN时 对照表下载 资源 前言 一、conda环境 1.1 创建固定python版本的conda环境 conda create --name tang_py_3.12 python3.12.41…...

Android Gradle Plugin (AGP) 和 Gradle 的關係

Android Gradle Plugin (AGP) 与 Gradle 的核心关系解析 一、功能定位 Gradle 的通用性‌ Gradle 是跨平台构建工具&#xff0c;支持 Java、Kotlin、C 等多种语言&#xff0c;提供任务自动化、依赖管理等功能。 通过 build.gradle 文件定义构建脚本&#xff0c;管理编译、测试…...

字典树(前缀树)的实现(5)0423

字典树又称前缀树或Trie树&#xff0c;是处理字符串中常见的数据结构。假设组成所有单词的字符仅是"a"~"z"&#xff0c;请实现字典树结构&#xff0c;并包含以下四个功能。 void insert(String word) :添加word&#xff0c;可重复添加。 void delete(Str…...

PHP 反序列化原生类 TIPS字符串逃逸CVE 绕过漏洞属性类型特征

#PHP- 属性类型 - 共有 & 私有 & 保护 1 、对象变量属性&#xff1a; public( 公共的 ): 在本类内部、外部类、子类都可以访问 protect( 受保护的 ): 只有本类或子类或父类中可以访问 private( 私人的 ): 只有本类内部可以使用 2 、序列化数据显示&#xff1a; p…...

专题二十:路由策略与策略路由

一、路由策略 1.1 路由策略的概念 路由策略是通过修改路由表的路由条目来控制数据流量的可达性。即对接受和发布的路由进过滤。这种方式称为路由策略 路由策略功能相关作用控制路由的发布可通过路由策略对所要发布的路由信息进行过滤&#xff0c;只允许发布满足条件的路由信…...

Git 远程操作全攻略:从基础到实战

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Git 企业级应用 目录 一&#xff1a;&#x1f525; 理解分布式版本控制系统 二&#xff1a;&#x1f525; 远程仓库 &#x1f98b; 新建远程仓库&#x1f98b; 克隆远程仓库&#x1f98b; 向远程仓…...

VUE自动定义控件SwitchButton

<switch-button style"margin-left: 20rpx;" :buttons["一键打分", "快捷打分"] select"快捷打分" ButtonClick"SwitchButnClick"></switch-button> SwitchButton.vue <template><view class"Di…...

【数据可视化-24】巧克力销售数据的多维度可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

STM32---串口通信USART

目录 一、串口通信协议 二、USART模块介绍 &#xff08;1&#xff09;移位寄存器 &#xff08;2&#xff09;控制电路 &#xff08;3&#xff09;波特率 &#xff08;4&#xff09;C语言接口 三、串口的引脚初始化 &#xff08;1&#xff09;引脚分布表 &…...

YOLO11改进-Backbone-引入TransXNet替换YOLO backbone 学习全局和局部动态信息,提高检测精度

Vision Transformer 的缺陷&#xff1a;Vision Transformer&#xff08;ViT&#xff09;运用多头自注意力机制在计算机视觉领域取得进展&#xff0c;但它缺乏卷积神经网络&#xff08;CNNs&#xff09;所具有的归纳偏差&#xff0c;导致泛化能力相对较弱。像 Swin Transformer …...

SQL 多表查询:数据整合与分析的强大工具

SQL 多表查询&#xff1a;数据整合与分析的强大工具 在关系型数据库中&#xff0c;数据通常被组织在多个表中。这种表的分离有助于减少冗余并提高数据的管理效率。然而&#xff0c;在实际应用中&#xff0c;往往需要对多个表中的数据进行整合查询&#xff0c;来获得更完整的信…...

MCU开发学习记录11 - ADC学习与实践(HAL库) - 单通道ADC采集、多通道ADC采集、定时器触发连续ADC采集 - STM32CubeMX

名词解释&#xff1a; ADC&#xff1a; Analog-to-Digital SAR&#xff1a;Successive Approximation Register 本文将介绍ADC的概念、相关函数以及STM32CubeMX生成ADC的配置函数。针对于ADC实践&#xff1a;单通道采集芯片内部温度传感器&#xff08;ADC1_ch16&#xff09;&a…...

MacOS中安装Python(homebrew,pyenv)

前言 由于MacOS中自带Python&#xff0c;而自带的Python关联到许多系统组件&#xff0c;不推荐 禁止使用自带Python 安装homebrew包管理器 homebrew官网 打开终端&#xff08;terminal&#xff09;输入以下命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercon…...

从物理到预测:数据驱动的深度学习的结构化探索及AI推理

在当今科学探索的时代&#xff0c;理解的前沿不再仅仅存在于我们书写的方程式中&#xff0c;也存在于我们收集的数据和构建的模型中。在物理学和机器学习的交汇处&#xff0c;一个快速发展的领域正在兴起&#xff0c;它不仅观察宇宙&#xff0c;更是在学习宇宙。 AI推理 我们…...

新书速览|Hadoop与Spark大数据全景解析(视频教学版)

《Hadoop与Spark大数据全景解析:视频教学版》 01 本书内容 《Hadoop与Spark大数据全景解析:视频教学版》结合作者多年在大数据领域的开发实践经验&#xff0c;采用“理论实战”的形式&#xff0c;以大量实例全面介绍Hadoop和Spark的基础知识及其高级应用。作者将丰富的教学经…...

Linux:42线程控制lesson30

代码1&#xff1a;验证join可以去的线程执行完后的退出码/返回值 #include<iostream> #include<unistd.h> #include<pthread.h> #include<string> using namespace std;void* routine(void* arg){string name static_cast<const char*>(arg);i…...

配置 Apache 的 HTTPS

证书文件 文件名 作用 来源 example.com.key 服务器的私钥&#xff0c;用于加密和解密数据。 本地生成 -----BEGIN PRIVATE KEY----- MIIEowIBAAKCAQEAqp5c... -----END PRIVATE KEY----- example.com.csr Certificate Signing Request 证书签名请求文件&#xff0c;包…...

【Flutter高效开发】GetX指南:一文学会状态管理、路由与依赖注入

GetX是Flutter生态中最受欢迎的轻量级全能框架&#xff0c;以其简洁的API设计和卓越的性能著称。本文将带你全面掌握GetX的核心功能和使用技巧&#xff0c;提升你的Flutter开发效率。 一、GetX框架核心优势 1. 三位一体架构设计 模块功能传统方案对比状态管理响应式状态控制…...

第四节:核心概念高频题-Vue生命周期钩子变化

重命名&#xff1a;beforeDestroy→beforeUnmount&#xff0c;destroyed→unmounted 新增&#xff1a;onServerPrefetch&#xff08;SSR场景&#xff09; Vue 生命周期钩子变化详解&#xff08;Vue2 → Vue3&#xff09; 一、核心钩子重命名与语义优化 销毁阶段语义化升级 • …...