【Redis】理论进阶篇------浅谈Redis的缓存穿透和雪崩原理

一、缓存穿透

1、概念

缓存穿透(查不到数据),是指当用户想要查询数据的时候,会先去Redis中取命中,如果Redis中没有该数据,那么就会向数据库中去查找数据。如果数据库中也没有,则该次查询结果失败。但是当我们的用户增多或者用户源源不断的发起请求,redis中也没有命中,全去访问了持久层数据库,这就会导致数据库造成很大的压力,这时候就相当于出现了缓存穿透。

be1d996bf094498297036d816e2bbf29.png如图所示:Client发送请求,若Redis中没有,就把所有请求转向MySQL数据库,当请求增多,MySQL压力增大,就会出现缓存穿透现象。

2、解决方法

①:布隆过滤器(BloomFilter)

布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,先在控制台进行校验,不符合则丢弃,从而避免对底层数据库的压力。

ca8892e5705e46129f532edce7301857.png

布隆过滤器作用是判断数据是否存在集合之中,正好和Redis这个缓存的场景相同,如图所示,当我们的数据到Redis之前先在BloomFilter检验,如果数据不符合规范,就丢弃,减少对数据库的压力。

②:缓存空对象

当存储层不被命中后,即使返回一个空对象也将其缓存起来,同时设置一个过期时间,之后再访问这个数据会从缓存中取,保护了后端的数据源。

06b9fa063484476a873f67405b8e4032.png

缺点:

a.如果空值被缓存起来,则缓存需要更多的空间存储更多的键(会有更多空的键);

b.即使设置了过期的时间,还是会在缓存层和存储层的数据会有一段时间窗口不一致,这对需要保持一致性的业务会有影响。

二、缓存击穿

1、概念

缓存击穿(查询的量太大),是指一个key非常热点,在不断的扛着大并发,大并发集中的对这个点进行访问,当这个key在失效的瞬间,持续的大并发就穿透了缓存,直接请求数据库,由于是热点数据,数据量很大,在缓存过期的同时,大量数据访问我们数据库,并且回写到缓存,会导致数据库瞬间压力过大。

2、解决方法

①:设置热点数据永不过期

从缓存的层面来看,没有设置过期时间,所以不会出现热点key过期后产生的问题。

②:加互斥锁

分布式锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有收获分布式锁的权限,因此只需要等到即可。这种方式将高并发的压力转移到了分布式锁上,因此对分布式锁的考验很大。如下图所示:

f4f282944a47455a98c0a8a0361fe3a1.png三、缓存雪崩

1、概念

缓存雪崩,是指在某一个时间段,缓存集中过期失效,redis宕机了。

如下图所示:

868823b8a7ad48bc97730784136baaef.png

2、解决方法

①:Redis的高可用

既然redis可能挂掉,那我们就可以多设置几台redis,搭建一个集群,这样一来一台机器挂掉后其他的还可以继续工作。

②:限流降级

在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询寻数据和写缓存,其他线程等待。

③:数据预热

数据加热的含义就是正式部署之前,我们把可能的数据预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发前动手加载缓存中不同的key,设置不同的过期时间,让缓存的时间点尽量均匀。

四、总结

      这部分的内容是对b站up主【狂神说Java】内容的总结,这里只是讲解了大概的原理,让大伙知道有这些情况,那后期呢,博主会再出一期详细的博客,讲解关于这些情况的具体实例以及一些相关算法讲解。如果对屏幕前的小伙伴有所帮助,不要忘记,点赞👍,支持博主一波哦!

 

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

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

相关文章

Linux之信号

首先我们来了解一下信号的概念! 我们可以以上红框中的4个特点。 进程分为前台和后台进程,前台进程只有一个,后台进程可以有多个!(并且后台进程不能用ctrl+c中止,只能用kill -9去杀掉) jobs可以看作业标识号! (ctrl+z可以暂停进程,不能暂停前台进程,如果暂停就会被…

Eclipse中Working Sets是用来做什么的?

当Eclipse中创建了太多的project,太多了,看的眼花缭乱,不好管理,也不想更换工作空间,Eclipse中 Java Working Set 工作集,可以将这些project分组,就像文件夹分类存放文件一样。 多说一句,感觉E…

C++ Primer 笔记(总结,摘要,概括)——第2章 变量和基本类型

目录 2.1 基本内置变量 2.1.1 算术类型 2.1.2 类型转换 2.1.3 字面值常量 2.2 变量 2.2.1 变量定义 2.2.2 变量声明和定义的关系 2.2.3 标识符 2.2.4 名字的作用域 2.3 复合类型 2.3.1 引用 2.3.2 指针 2.3.3 理解复合类型的声明 2.4 const限定符 2.4.1 const的引用 2.4.2…

【时事篇-05-03】20240222 金额145-150元填充27笔货币基金的具体数目测算( itertools)

作品展示 背景需求: 通过 itertools计算2525元存17笔145-150元金额的最适合方案 【时事篇-05-02】20240221 2525元存17只货币基金的具体数目测算( itertools)-CSDN博客文章浏览阅读823次,点赞32次,收藏13次。【时事篇…

陈世元:被保送中科院,两次被裁,人生不能老是按部就班的走下去,需要冒险,尝试一下新的东西

《程客有话说》是我们最新推出的一个访谈栏目,邀请了一些国内外有趣的程序员来分享他们的经验、观点与成长故事,我们尝试建立一个程序员交流与学习的平台,也欢迎大家推荐朋友或自己来参加我们的节目,一起加油。 本期我们邀请的程…

MyBatisPlus常用注解

目录 一、TableName 二、TableId 三、TableField 四、TableLogic 一、TableName 在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,只是在Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表 由此得出…

AD9226 65M采样 模数转换

用 vivado 写的 AD9220_ReadTEST module AD9220_ReadTEST( input clk, input rstn,output clk_driver, //模块时钟管脚 input [12:0]IO_data, //模块数据管脚output [11:0]ADC_Data,//12位ADC数据 output ADC_OTR //信号过压标志位 );wire areset, pll260m_lockedPIN; wire…

BigTime赛前季:2.027亿美金$BIGTIME玩家空投,塑造Web3游戏新时代

公开游戏策略和统计数据,证明游戏的未来在于真正以玩家为中心。 Big Time 工作室宣布,其旗舰作品 Big Time 的 pre-alpha 版本季前赛预开发阶段取得成功,这是一款混合了动作游戏与 MMORPG 的免费游戏。这是独一无二的类型融合,它结…

项目解决方案:校园云视频平台方案(视频接入、汇聚、联网、分享)

目 录 一、项目需求 二、系统设计方案 三、平台功能 四、案例展示 本方案分四个部分:项目需求、系统设计方案、平台基础功能、案例展示,如下: 一、项目需求 二、系统设计方案 通过AS-V1000视频资源综合管理平台实现监控视频的接入、…

JavaWeb——003Axios Vue组件库(Element)

目录 一、Ajax 1、同步与异步​编辑 2、原生Ajax(繁琐)​编辑 2.1、写一个简易的Ajax 3、Axios(推荐使用)​编辑 3.1、Axios入门 3.2、Axios请求方式别名 3.3、案例:基于Vue及Axios完成数据的动态加载展示​编…

将一个 PostgreSQL 数据库复制到另一个数据库中

以管理员身份进入cmd窗口,输入如下命令 语法: pg_dump -C -h 本机IP -U 本机postgresql用户名 源数据库名 | psql -h 服务器IP -U 服务器postgresql用户名 目标数据库名 示例: pg_dump -C -h 127.0.0.1 -U postgres test01-dbname | psql…

十七、鼠标操作与响应

项目功能实现&#xff1a;通过移动鼠标&#xff0c;在图片上实现类似画板绘制矩形的功能&#xff0c;并把绘制的矩形区域单独显示出来 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 mouse.h #pragma once#include<opencv2/opencv.hpp>using namespac…