【Redis】理论进阶篇------浅谈Redis的缓存穿透和雪崩原理
一、缓存穿透
1、概念
缓存穿透(查不到数据),是指当用户想要查询数据的时候,会先去Redis中取命中,如果Redis中没有该数据,那么就会向数据库中去查找数据。如果数据库中也没有,则该次查询结果失败。但是当我们的用户增多或者用户源源不断的发起请求,redis中也没有命中,全去访问了持久层数据库,这就会导致数据库造成很大的压力,这时候就相当于出现了缓存穿透。
如图所示:Client发送请求,若Redis中没有,就把所有请求转向MySQL数据库,当请求增多,MySQL压力增大,就会出现缓存穿透现象。
2、解决方法
①:布隆过滤器(BloomFilter)
布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,先在控制台进行校验,不符合则丢弃,从而避免对底层数据库的压力。

布隆过滤器作用是判断数据是否存在集合之中,正好和Redis这个缓存的场景相同,如图所示,当我们的数据到Redis之前先在BloomFilter检验,如果数据不符合规范,就丢弃,减少对数据库的压力。
②:缓存空对象
当存储层不被命中后,即使返回一个空对象也将其缓存起来,同时设置一个过期时间,之后再访问这个数据会从缓存中取,保护了后端的数据源。

缺点:
a.如果空值被缓存起来,则缓存需要更多的空间存储更多的键(会有更多空的键);
b.即使设置了过期的时间,还是会在缓存层和存储层的数据会有一段时间窗口不一致,这对需要保持一致性的业务会有影响。
二、缓存击穿
1、概念
缓存击穿(查询的量太大),是指一个key非常热点,在不断的扛着大并发,大并发集中的对这个点进行访问,当这个key在失效的瞬间,持续的大并发就穿透了缓存,直接请求数据库,由于是热点数据,数据量很大,在缓存过期的同时,大量数据访问我们数据库,并且回写到缓存,会导致数据库瞬间压力过大。
2、解决方法
①:设置热点数据永不过期
从缓存的层面来看,没有设置过期时间,所以不会出现热点key过期后产生的问题。
②:加互斥锁
分布式锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有收获分布式锁的权限,因此只需要等到即可。这种方式将高并发的压力转移到了分布式锁上,因此对分布式锁的考验很大。如下图所示:
三、缓存雪崩
1、概念
缓存雪崩,是指在某一个时间段,缓存集中过期失效,redis宕机了。
如下图所示:

2、解决方法
①:Redis的高可用
既然redis可能挂掉,那我们就可以多设置几台redis,搭建一个集群,这样一来一台机器挂掉后其他的还可以继续工作。
②:限流降级
在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询寻数据和写缓存,其他线程等待。
③:数据预热
数据加热的含义就是正式部署之前,我们把可能的数据预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发前动手加载缓存中不同的key,设置不同的过期时间,让缓存的时间点尽量均匀。
四、总结
这部分的内容是对b站up主【狂神说Java】内容的总结,这里只是讲解了大概的原理,让大伙知道有这些情况,那后期呢,博主会再出一期详细的博客,讲解关于这些情况的具体实例以及一些相关算法讲解。如果对屏幕前的小伙伴有所帮助,不要忘记,点赞👍,支持博主一波哦!
相关文章:
【Redis】理论进阶篇------浅谈Redis的缓存穿透和雪崩原理
一、缓存穿透 1、概念 缓存穿透(查不到数据),是指当用户想要查询数据的时候,会先去Redis中取命中,如果Redis中没有该数据,那么就会向数据库中去查找数据。如果数据库中也没有,则该次查询结果失…...
Rocky Linux安装部署Elasticsearch(ELK日志服务器)
一、Elasticsearch的简介 Elasticsearch是一个强大的开源搜索和分析引擎,可用于实时处理和查询大量数据。它具有高性能、可扩展性和分布式特性,支持全文搜索、聚合分析、地理空间搜索等功能,是构建实时应用和大规模数据分析平台的首选工具。 …...
Linux浅学笔记04
目录 Linux实用操作 Linux系统下载软件 yum命令 apt systemctl命令 ln命令 日期和时区 IP地址 主机名 网络传输-下载和网络请求 ping命令 wget命令 curl命令 网络传输-端口 进程 ps 命令 关闭进程命令: 主机状态监控命令 磁盘信息监控:…...
【Day59】代码随想录之动态规划_647回文子串_516最长回文子序列
文章目录 动态规划理论基础动规五部曲:出现结果不正确: 1. 647回文子串2. 516最长回文子序列 动态规划理论基础 动规五部曲: 确定dp数组 下标及dp[i] 的含义。递推公式:比如斐波那契数列 dp[i] dp[i-1] dp[i-2]。初始化dp数组…...
ECLIP
denote the representation of the positive prompt produced by the momentum model as h ξ i h_{\xi}^{i} hξi 辅助信息 作者未提供代码...
STM32 +合宙1.54“ 电子墨水屏(e-paper)驱动显示示例
STM32 合宙1.54“ 电子墨水屏(e-paper)驱动显示示例 📍相关篇《Arduino框架下ESP32/ESP8266合宙1.54“ 电子墨水屏(e-paper)驱动显示示例》🔖程序是从GooDisplay品牌和微雪电子下同型号规格墨水屏的示例程序…...
使用Postman和JMeter进行signature签名
一、前言 有些接口的请求会带上sign(签名)进行请求,各接口对sign的签名内容、方式可能不一样,但一般都是从接口的入参中选择部分内容组成一个字符串,然后再进行签名操作, 将结果赋值给sign; 完整规范的接口文档都会…...
uni-app nvue vue3 setup中实现加载webview,解决nvue中获取不到webview实例的问题
注意下面的方法只能在app端使用, let wv plus.webview.create("","custom-webview",{plusrequire:"none", uni-app: none, width: 300,height:400,top:uni.getSystemInfoSync().statusBarHeight44 }) wv.loadURL("https://ww…...
IPD(集成产品开发)—核心思想
企业发展到一定阶段就会遇到管理瓶颈,IPD流程是一种高度结构化的产品开发流程,它集成了业界很多优秀的产品开发方法论,像搭积木一样的组合成一种非常有效的流程。如果我们能根据企业的规模和行业特点,对全流程的IPD进行合适的裁剪…...
uniapp android 原生插件开发-测试流程
前言 最近公司要求研究一下 uniapp 的 android 原生插件的开发,为以后的工作做准备。这篇文章记录一下自己的学习过程,也帮助一下有同样需求的同学们 : ) 一、下载安装Hbuilder X , Android studio(相关的安装配置过程网上有很多,…...
MyCAT从入门到实战(配置文件介绍)
用户(user) 配置文件位置mycat/conf/user/root.user.json。这个配置文件主要是用来配置MyCAT的登录用户 的,也就是我们连接8066这个端口的用户信息。 [rootservice bin]# cat /usr/local/mycat/conf/users/root.user.json {"dialect&q…...
【LeetCode-300】最长递增子序列(动归)
目录 题目描述 解法1:动态规划 代码实现 题目链接 题目描述 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例…...
Mysterious-GIF-攻防世界-MISC
题目简介: 下载得到gif文件,十六进制编辑器查看,发现末尾有50 4B 03 04文件头。提取后保存为zip文件。 解压该zip文件,得到temp.zip。十六进制编辑器查看temp.zip,会发现有多个文件头和文件尾。 用binwalk分离temp.zi…...
【数据结构和算法初阶(C语言)】链表-单链表(手撕详讲单链表增删查改)
目录 1.前言:顺序表回顾: 1.1顺序表的优缺点 2.主角----链表 2.1链表的概念 2.2定义一个单链表的具体实现代码方式 3.单链表对数据的管理----增删查改 3.1单链表的创建 3.2单链表的遍历实现 3.2.1利用遍历实现一个打印我们链表内容的函数的函数…...
【Go语言】Go语言中的切片
Go语言中的切片 1.切片的定义 Go语言中,切片是一个新的数据类型数据类型,与数组最大的区别在于,切片的类型中只有数据元素的类型,而没有长度: var slice []string []string{"a", "b", "c…...
Qt程序设计-钟表自定义控件实例
本文讲解Qt钟表自定义控件实例。 效果如下: 创建钟表类 #ifndef TIMEPIECE_H #define TIMEPIECE_H#include <QWidget> #include <QPropertyAnimation> #include <QDebug> #include <QPainter> #include <QtMath>#include <QTimer>#incl…...
Redis的发布订阅功能教程,实现实时消息和key过期事件通知功能
Redis的发布订阅 Redis的发布/订阅(Pub/Sub)功能是一种消息传递模式,用于实现消息发布者(publisher)和订阅者(subscriber)之间的消息通信。在这种模式下,消息的发送者(发布者)将消息发送到特定的频道(channel),而订阅了该频道的接收者(订阅者)将会接收到这些消息…...
4核8g服务器能支持多少人访问?
腾讯云4核8G服务器支持多少人在线访问?支持25人同时访问。实际上程序效率不同支持人数在线人数不同,公网带宽也是影响4核8G服务器并发数的一大因素,假设公网带宽太小,流量直接卡在入口,4核8G配置的CPU内存也会造成计算…...
【Android】切换系统全局语言设置
前两种为应用内部处理,第三种为发送广播由系统服务进行处理 使用反射 这种会直接将安卓设置内的语言列表清空,然后将选择的语言设置为系统语言 该方法存在问题,在首次开机后设置会导致国外应用进不去(只对于here地图个别版本) /*** 设置语言…...
【递归】【回溯】Leetcode 112. 路径总和 113. 路径总和 II
【递归】【回溯】Leetcode 112. 路径总和 113. 路径总和 II 112. 路径总和解法:递归 有递归就有回溯 记得return正确的返回上去 113. 路径总和 II解法 递归 如果需要搜索整棵二叉树,那么递归函数就不要返回值 如果要搜索其中一条符合条件的路径ÿ…...
开启MySQL8的密码策略组件validate_password
一、validate_password组件安装配置1. 安装组件INSTALL COMPONENT file://component_validate_password;安装后,密码策略立即生效,但仅影响后续操作(如新建用户或修改密码)。2. 卸载组件UNINSTALL COMPONENT file://component_val…...
爬虫对抗:ZLibrary 反爬机制实战分析
引言ZLibrary 作为全球规模领先的数字文献共享平台,累计收录超千万册电子书籍与学术文献,在知识传播与资源获取领域具备广泛影响力,同时也因海量公开可访问数据成为网络爬虫的重点目标。网络爬虫作为自动化数据采集的核心工具,可高…...
PP-DocLayoutV3法律文书应用:合同/判决书/公证材料非规则排版智能分割
PP-DocLayoutV3法律文书应用:合同/判决书/公证材料非规则排版智能分割 1. 引言:法律文档处理的智能化突破 在日常的法律工作中,我们经常需要处理各种复杂的文档格式。传统的合同、判决书、公证材料往往采用非规则排版,包含表格、…...
Python Web应用负载均衡方案_结合Nginx权重设置实现高可用
Nginx upstream 权重未生效,主因是未启用加权轮询策略、存在 ip_hash 等冲突指令、weight 参数缺失或 Nginx 版本过低(需 ≥1.9.1);务必验证配置语法、检查健康检查设置及后端响应。nginx upstream 配置权重时,后端服务…...
量化策略回测必备:一份让TA-Lib的MACD/KDJ与通达信对齐的Python代码库
量化策略回测必备:让TA-Lib的MACD/KDJ与通达信严格对齐的工程实践 在量化交易领域,技术指标的计算一致性是策略回测可靠性的生命线。许多开发者都遇到过这样的困境:自己用TA-Lib计算的MACD指标与通达信软件显示的结果存在微妙差异,…...
工业视觉老鸟的避坑指南:指针仪表识别,为什么你的Hough检测总是不准?
工业视觉实战:指针仪表识别的五大核心挑战与高鲁棒性解决方案 在工业质检和设备监控领域,指针式仪表的自动识别一直是个看似简单实则暗藏玄机的问题。许多工程师在初步实现Hough变换检测后,往往会遇到晴天霹雳——测试时效果尚可的算法&#…...
OneNet平台生成token注意事项
1、如果生成的是设备级鉴权 设备级鉴权时,res字段为products/{产品id}/devices/{设备名},key为设备级key key里面填的应该是设备的密钥生成token的工具截图2、如果生成的是产品/用户级鉴权 产品级鉴权时,res字段为products/{产品id}ÿ…...
ERP系统与医疗器械生产管理规范的契合点
ERP系统与医疗器械生产管理规范的契合点 医疗器械生产管理规范(GMP)对数据完整性、过程追溯性、质量管理体系有严格要求。ERP系统通过以下模块实现合规: 主数据管理 建立医疗器械唯一标识(UDI)数据库,确保产…...
【AI Agent工程实战系列②】工具调用的正确姿势——不只是写个函数那么简单
先模拟一个场景 我们有一个Agent负责处理内部的IT工单,工具列表里有两个长得很像的工具: def get_user_info(user_id: str) -> dict:"""获取用户的基本信息"""...def get_user_permissions(user_id: str) -> dict:"""获…...
别再傻傻分不清了!GCC、Glibc、Libstdc++ 在 Linux 下到底是啥关系?
别再傻傻分不清了!GCC、Glibc、Libstdc 在 Linux 下到底是啥关系? 刚接触 Linux C/C 开发时,最让人头疼的莫过于那些晦涩难懂的编译错误。比如 undefined reference to std::cout 或者 glibc version not found,新手往往一脸茫然&…...
