一文搞懂什么是缓存穿透、缓存雪崩、缓存击穿三个概念,以及解决方案

先理解概念:【注:我们这里说的是分布式、高并发环境】
一、缓存穿透是什么?

缓存穿透是指:请求【可以有很多】的数据在缓存、关系型数据库中都不存在,每次来查询都会查询到关系型数据库中。

在这里插入图片描述

解决方案:
1、将空对象缓存到Redis:
简单的说就是第一次如果去关系型数据库查询回来如果为空,就将将空值也缓存到Redis(如:set keyxxx null),可以将过期时间设置短一点,避免大量的null值占用内存,如遇到key值饱和攻击将会是很大的麻烦,内存会被这些空值大量占用。

优点:实现简单。
缺点:不存在的key-value占用内存;高并发环境多个线程同时访问,可能存在缓存过期前或者刷缓存前查询都为空,返回不了真实数据。

2、使用布隆过滤器
所谓布隆过滤器就是一个很大的bitmap,由二进制向量表和一系列随机映射函数组成。里面并不存放真实的数据,里面只是标识位(0/1),某个key在hash过后来查不用过滤器返回为0就表示数据库不存在该数据,直接给请求返回为空就行,有值就是1,然后就可以查询缓存服务器,或者去查关系型数据库了。实现方案(redisson+redis,redisson本来就封装好了布隆过滤器、guava、fpp都可以)。

------------------->>>> redisson方案:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.13.0</version></dependency>
</dependencies>------------------->>>> guava方案:<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>29.0-jre</version>
</dependency>

优点:布隆过滤器内存占用较少;
缺点:实现相对复杂一丢丢、布隆过滤器存在误判【原因是hash冲突,如果key的hash值相同,就会引起本来没值的key判断成了有值,去查Redis或者MySQL】。

二、缓存击穿是什么?

缓存击穿:指一个被高并发访问且缓存重建业务较复杂的key突然失效了,无数查询这个key的请求瞬间会直接打在关系型数据库上,给数据库带来了巨大的压力,通常也叫热点Key问题
在这里插入图片描述

解决方案:

1、互斥锁

高并发环境,避免缓存不存在这个key的数据,然后多个线程并发的去访问数据库,我们需要在查询缓存结束,没有数据后,在查询数据库前需要设置一道分布式锁,拿到锁的才可以执行后续逻辑,拿不到的可以让他等待一段时间重试缓存是否有数据,这里不能重试查询关系型数据库哦【这里锁的设置需要考虑:锁的可重入、可重试、锁的超时释放、锁的主从一致性】。

2、逻辑过期

key的失效多数是由于到了过期时间的key被清理,而新的该key的缓存还没建立,而此时来了大量请求,那我们是不是可以:设置该key不主动失效、分布式锁解决。
a、key不主动失效,不是不主动失效,可以利用Redis的hash结构将过期时间拼接在value里面(如:hset product_01 1000 timestamp ),用户自己去决定这个key是否过期删除,类似于Redis的key的惰性删除原理,如果有请求过来,查询该key时候,会有一次检查过期时间的操作,如果过期了就先加锁,暂时阻塞其他线程访问数据库,然后删除该缓存,接着再请求数据库写入缓存,释放锁【只能删除自己的锁】,返回数据,其他线程可以查询缓存返回数据库了。这里有可能存在极端情况就是在更新缓存期间,其他线程等待时间过长,直接返回空数据回去。这里也可以考虑MQ异步的去更新缓存哦。

三、缓存雪崩

缓存雪崩:是指同一时段内缓存中大量的key同时失效或者缓存服务器宕机,导致大量请求打在关系型数据库上,关系型数据库有可能瞬间被打死。【通常8c16g的mysql数据库,单台主库2000次/s并发写是可以扛住的,从库8c16g可以达到5000多qps】

在这里插入图片描述

解决方案:

1、key同时段失效的情况:
a、 给key的过期时间设置随机值,比如说选择:60s~600s,随机一个数字为过期时间。
b、多级缓存,然后设置不同的过期时间;
c、结合网关、hystrix/sentinel 限流,大批量的请求不用全都放过来,可以允许一部分请求一次失败,让客户重试,比如:抢购、抢红包;
d、结合MQ,请求直接先放到MQ里面,异步的查询Redis或者关系型数据库,异步返回数据,消费者慢慢消费,几乎也都可以做到毫秒或者秒级的返回,高并发的环境,一般用户等待个几秒钟都是可以接受的,不用追求极致,也需要在成本、用户体验、性能、可用性之间做个平衡,作为架构师应该要考虑到这些问题。

2、缓存服务器宕机的情况
这个要尽可能的实现缓存服务的高可用了,不管是缓存的:主从+哨兵、分片+主从+哨兵、集群(一致性hash结构/避免hash倾斜的增加虚拟节点的结构)+哨兵+主从等结构,都可以。注意:主从节点一般都是至少三个节点,且最好是奇数个节点,避免集群选举出现脑裂或者票数一半一半,选不出来,qurom=半数节点以上,majority=存活实例数/2+1。

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

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

相关文章

CUMT--Java复习--核心类

目录 一、装箱与拆箱 二、“”与equals 三、字符串类 1、String、StringBuffer、StringBuilder的区别 2、String类 3、StringBuffer类 4、StringBuilder类 四、类与类之间关系 一、装箱与拆箱 基本类型与对应封装类之间能够自动进行转换&#xff0c;本质就是Java的自…

强烈推荐 25个 前端开源中后台管理系统

作为程序员&#xff0c;构建一套个人专属的后台管理系统非常重要。这不仅是为了打造自己独有的开发生态&#xff0c;更是因为我们正处于个人开发和AI模型泛滥的时代。利用AI增强自己的系统变得尤为关键。然而&#xff0c;在UI界面设计方面&#xff0c;我们可能需要参考开源项目…

mysql原理--Explain详解

1.概述 一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的 执行计划 &#xff0c;这个执行计划展示了接下来具体执行查询的方式&#xff0c;比如多表连接的顺序是什么&#xff0c;对于每个表采用什么访问方法来具体执行查询等等。设计 MySQL 的…

实时交通标志检测和分类(代码)

交通标志检测和分类技术是一种基于计算机视觉和深度学习的先进技术&#xff0c;能够识别道路上的各种交通标志&#xff0c;并对其进行分类和识别。这项技术在智能交通系统、自动驾驶汽车和交通安全管理领域具有重要的应用前景。下面我将结合实时交通标志检测和分类的重要性、技…

第9章 继承和派生习题(详解)

一、选择题 1&#xff0e;下列表示引用的方法中&#xff0c; &#xff08;&#xff09; 是正确的。已知&#xff1a;int m10&#xff1a; A&#xff0e;int &xm&#xff1b; B&#xff0e;int &y10&#xff1b; C&#xff0e;int &z&#xff1b; D&#xff0e;fl…

Java中利用Redis,ZooKeeper,数据库等实现分布式锁(遥遥领先)

1. 分布式锁 1.1 什么是分布式锁 在我们进行单机应用开发涉及并发同步的时候&#xff0c;我们往往采用synchronized或者ReentrantLock的方式来解决多线程间的代码同步问题。但是当我们的应用是在分布式集群工作的情况下&#xff0c;那么就需要一种更加高级的锁机制&#xff0…

合伙企业法关于合伙企业的要求

合伙协议可以载明合伙企业的经营期限和合伙人争议的解决方式。 合伙协议经全体合伙人签名、盖章后生效。合伙人依照合伙协议享有权利&#xff0c;承担责任。 经全体合伙人协商一致&#xff0c;可以修改或者补充合伙协议。 申请合伙企业设立登记&#xff0c;应当向企业登记机关提…

git rebase应用场景三

文章目录 git rebase应用场景三 git rebase应用场景三 在我们的开发分支中 假设我们修改一个文件 提交一个版本 再回到master分支 同时也去修改1.txt文件&#xff0c;提交一个版本 这样相当于master分支提交了一次&#xff0c;dev也提交了一次 然后回到dev分支 此时会报错…

事务失效的十种常见场景

学习事务失效场景 1 概述 事务的传播类型isolationTransactionnal注解属性 事务方法未被Spring管理方法使用final类型修饰非public修饰的方法同一个类中的方法相互调用方法的事务传播类型不支持事务异常被内部catch&#xff0c;程序生吞异常数据库不支持事务未配置开启事务错…

【ChatGPT 默认强化学习策略】PPO 近端策略优化算法

PPO 近端策略优化算法 PPO 概率比率裁剪 演员-评论家算法演员-评论家算法&#xff1a;多智能体强化学习核心框架概率比率裁剪&#xff1a;逐步进行变化的方法PPO 目标函数的设计重要性采样KL散度 PPO 概率比率裁剪 演员-评论家算法 论文链接&#xff1a;https://arxiv.org…

Oracle-深入了解cache buffer chain

文章目录 1.Cache buffer chain介绍2.Buffer cache的工作原理3 Buffer chains4.Multi-versioning of Buffers5.Latches6.诊断CBC latch等待7.解决 CBC Latch等待 1.Cache buffer chain介绍 经常看到会话等待事件“latch&#xff1a;cache buffers chain”。 如果想知道意味着什…

FA对接FC流程

2、FA进行对接 &#xff08;1&#xff09;首先安装好AD域控服务器DHCPDNS&#xff08;注意&#xff0c;不要忘记了做DNS正反向解析&#xff0c;就是把已经安装了ITA的主机做解析&#xff09;&#xff0c;在里面创建域用户 &#xff08;2&#xff09;安装ITA和VAG/VLB&#xf…

2024孙多勇®跨年演讲,重塑医美增长力,开启璀璨华章!

不谋万事者&#xff0c;不足谋一时&#xff1b;不谋全局者&#xff0c;不足谋一域。明者因时而变&#xff0c;智者随时而制。 12月31日-1月3日由汇成医美集团主办的&#xff0c;以“重塑医美增长力”为主题的第七届孙多勇跨年演讲暨「英雄2024」年度战略规划案&#xff0c;在中…

权威Scrum敏捷开发企业培训分享

课程简介 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架。 这是一个两天的实训课程&#xff0c;面向研发管理者、项目经理、产品经理、研发团队等&#xff0c;旨在帮助学员全面系统地学习Scrum和敏捷开发, 帮助企业快速启动敏…

Excel模板填充:从minio上获取模板使用easyExcel填充

最近工作中有个excel导出的功能&#xff0c;要求导出的模板和客户提供的模板一致&#xff0c;而客户提供的模板有着复杂的表头和独特列表风格&#xff0c;像以往使用poi去画是非常耗时间的&#xff0c;比如需要考虑字体大小&#xff0c;单元格合并&#xff0c;单元格的格式等问…

Maya-UE xgen-UE 毛发导入UE流程整理

首先声明&#xff1a;maya建议用2022版本及一下&#xff0c;因为要用到Python 2 ,Maya2023以后默认是Python3不再支持Python2; 第一步&#xff1a;Xgen做好的毛发转成交互式Groom 第二步&#xff1a;导出刚生成的交互式Groom缓存&#xff0c;需要设置一下当前帧&#xff0c;和…

大数据与人工智能|全面数字化战略与企业数字化转型(第1节 )

要点一&#xff1a;培养跨学科思维 在分析时&#xff0c;需要采用多学科的思维方式 结果不重要&#xff0c;重要的是如何提炼现象、分析问题和得出结论的过程。 1. 介绍了锤子精神和多学科思维方式的重要性。指出了只从自身学科出发解决问题的局限性。 2. 提倡跨学科思维方式&a…

2023下半年的总结

我从八月下旬开始写的&#xff0c;到现在差不多有半年了&#xff0c;总结一下吧&#xff01; 1.计算机视觉 在计算机视觉方面&#xff0c;想必两个有名的深度学习框架&#xff08;TensorFlow和PyTorch&#xff09;大家都很清楚吧&#xff0c;以及OpenCV库。对于人脸识别&…

在高并发场景下,缓存“雪崩”了怎么办

1. 缓存雪崩的常见原因 缓存“雪崩”是指&#xff0c;因为部分缓存节点不可用&#xff0c;而导致整个缓存系统&#xff08;甚至是整个服务系统&#xff09;不可用。缓存“雪崩”主要分为以下两种情况&#xff1a; 因缓存不支持 rehash 而导致的缓存“雪崩”缓存支持 rehash 时…

电脑怎么检测手机配置信息

摘要 本文介绍了如何使用克魔助手工具在电脑上检测手机的配置信息。通过该工具&#xff0c;用户可以全面了解手机的硬件和操作系统信息&#xff0c;包括电池、CPU、内存、基带信息和销售信息等。 引言 在日常工作中&#xff0c;了解手机的配置信息对于开发和测试人员非常重要…