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

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

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

在这里插入图片描述

解决方案:
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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

打破数据孤岛:ChatGPT如何打通金融大数据的任督二脉?

文章目录 一、引言二、ChatGPT与金融大数据分析的融合三、实践应用&#xff1a;ChatGPT在金融大数据分析中的优势与挑战四、案例分析&#xff1a;ChatGPT在金融大数据分析中的应用案例五、前景展望&#xff1a;ChatGPT在金融大数据分析领域的未来发展《AI时代Python金融大数据分…

Qt5 安装教程 - 跳过登录界面

Qt5 安装教程 - 跳过登录界面 引言一、下载二、安装三、使用四、修改、维护、卸载 引言 Qt5.14.2及以前的版本有离线安装包&#xff0c;无需登录 (老版本连登录界面也无)。之后的版本需登录进行在线安装。 本文以Qt5.12.2版本为例&#xff0c;说明如何跳过登录界面&#xff0c…

如何解决企业内部FTP文件传输速度过慢和安全问题

在数据化时代里&#xff0c;企业内部的文件传输永远是刚需&#xff0c;而因为 FTP协议的简单、易用、广泛支持等优点&#xff0c;让很多企业早期都普遍使用&#xff0c;随着数量量的增多&#xff0c;和对安全的要求越来越高&#xff0c;FTP也暴露出了一些列问题&#xff0c;小编…

算法逆袭之路(1)

11.29 开始跟进算法题进度! 每天刷4题左右 ,一周之内一定要是统一类型 而且一定稍作总结, 了解他们的内在思路究竟是怎样的!! 12.24 一定要每天早中晚都要复习一下 早中午每段一两道, 而且一定要是同一个类型, 不然刷起来都没有意义 12.26/27&#xff1a; 斐波那契数 爬…

使用 Tkinter 制作一个进制转换工具,好用!

在平时工作学习当中&#xff0c;我们经常会编写一些简单的 Python GUI 工具&#xff0c;以此来完成各种各样的自动化任务&#xff0c;比如批量处理文件&#xff0c;批量处理图片等等。当我们进行这些工具的编写之时&#xff0c;往往只关注了功能的实现&#xff0c;而忽略了页面…

Android 跨进程之间通信(IPC)方式之ContentProvider

Android 跨进程之间通信 Android 跨进程之间通信(IPC)方式之BroadcastReceiverAndroid 跨进程之间通信(IPC)方式之ContentProvider 文章目录 Android 跨进程之间通信前言一、ContentProvider 是什么&#xff1f;二、如何利用ContentProvider跨进程通信1.创建自定义ContentProv…

伺服电机:原点复位

一、原点复位概念 原点复位指的是&#xff0c;在驱动器使能时&#xff0c;触发原点复位功能后&#xff0c;电机将主动查找零点&#xff0c;完成定位功能。 那么问题来了&#xff0c;什么是原点&#xff0c;什么是零点&#xff1f; 原点&#xff1a;即机械原点&#xff0c;可…

面向对象知识点

类和对象知识点梳理 1. 类和对象的概念 类是对一类事物的描述&#xff0c;是抽象的、概念上的定义。Java 中定义类的关键字是&#xff1a;class。 具有相同特征和行为的对象抽象成类&#xff0c;类描述了这一类对象的属性和方法&#xff1a; 属性&#xff08;成员变量&#x…

分布式技术之数据复制技术

文章目录 什么是数据复制技术&#xff1f;数据复制技术原理及应用同步复制技术原理及应用异步复制技术原理及应用半同步复制技术原理及应用三种数据复制技术对比 什么是数据复制技术&#xff1f; 数据复制是一种实现数据备份的技术。数据复制技术&#xff0c;可以保证存储在不…

3D目标检测(教程+代码)

随着计算机视觉技术的不断发展&#xff0c;3D目标检测成为了一个备受关注的研究领域。与传统的2D目标检测相比&#xff0c;3D目标检测可以在三维空间中对物体进行定位和识别&#xff0c;具有更高的准确性和适用性。本文将介绍3D目标检测的相关概念、方法和代码实现。 一、3D目…

回溯法寻找元素之和等于目标值的子集

这是一个回溯法的算法,可以用来寻找所有元素之和等于目标值的子集. 整个算法中最重要的是:在递归之后"恢复现场" 也就是: t[cnt]0; cnt--; 完整代码(注释部分打印信息可以用来辅助理解递归过程)&#xff1a; #include<iostream> #include<cstring> …

RFC7636-PKCE

前言 PKCE &#xff08;RFC 7636&#xff09; 是授权代码流的扩展&#xff0c;用于防止 CSRF 和授权代码注入攻击。 PKCE 不是客户端身份验证的一种形式&#xff0c;PKCE 不能替代客户端密码或其他客户端身份验证。即使客户端使用客户端密码或其他形式的客户端身份验证&#…

oracle物化视图

物化视图定义 视图是一个虚拟表&#xff08;也可以认为是一条语句&#xff09;&#xff0c;基于它创建时指定的查询语句返回的结果集&#xff0c;每次访问它都会导致这个查询语句被执行一次&#xff0c;为了避免每次访问都执行这个查询&#xff0c;可以将这个查询结果集存储到…

【STM32】STM32学习笔记-输入捕获测频率和占空比(18)

00. 目录 文章目录 00. 目录01. 预留02. 输入捕获测频率接线图03. 输入捕获测频率示例04. 输入捕获测频率和占空比接线图05. 输入捕获测频率和占空比示例06. 示例程序下载07. 附录 01. 预留 02. 输入捕获测频率接线图 03. 输入捕获测频率示例 pwm.h #ifndef __PWM_H #define…

从入门到精通UNet: 让你快速掌握图像分割算法

文章目录 一、UNet 算法简介1.1 什么是 UNet 算法1.2 UNet 的优缺点1.3 UNet 在图像分割领域的应用 二、准备工作2.1 Python 环境配置2.2 相关库的安装 三、数据处理3.1 数据的获取与预处理3.2 数据的可视化与分析 四、网络结构五、训练模型5.1 模型训练流程5.2 模型评估指标5.…

【JS逆向】逆向案例之 ----- 安某客滑块

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 安某客滑块小结 1. 初步分析 总共分为两步&#xff0c; 获取滑块图片信息检查滑块移动是否正确 整体框架如下&#xff1a; 1.1 getinfoTp 获取图片信息…

Plantuml之JSON数据语法介绍(二十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Nx市工业数据洞察:Flask、MySQL、Echarts的可视化之旅

Nx市工业数据洞察&#xff1a;Flask、MySQL、Echarts的可视化之旅 背景数据集来源技术选型功能介绍创新点总结 背景 随着工业化的不断发展&#xff0c;Nx市工业数据的收集和分析变得愈发重要。本博客将介绍如何利用Flask、MySQL和Echarts等技术&#xff0c;从统计局获取的数据…

【Java进阶篇】JDK新版本中的新特性都有哪些

JDK新版本中的新特性都有哪些 ✔️经典解析✔️拓展知识仓✔️本地变量类型推断✔️Switch 表达式✔️Text Blocks✔️Records✔️封装类✔️instanceof 模式匹配✔️switch 模式匹配 ✅✔️虚拟线程 ✔️经典解析 JDK 8中推出了Lambda表达式、Stream、Optional、新的日期API等…

Halcon闭运算closing

Halcon闭运算 文章目录 Halcon闭运算 闭运算的计算步骤&#xff0c;为先膨胀&#xff0c;后腐蚀。这两步操作能将看起来很接近的元素&#xff0c;如区域内部的空洞或外部孤立的点连接成一体&#xff0c;区域的外观和面积也不会有明显的改变。通俗地说&#xff0c;就是类似于“填…