Redis-1 缓存穿透、缓存击穿、缓存雪崩

  • 缓存穿透

一.数据查询的流程

程序根据请求查询数据时,会先到redis中查询,如果redis中查到了目标数据,则直接返回;如果redis中没有目标数据,则到mysql中查找,找到目标数据后返回,同时将该数据写入到redis中。

二.什么是缓存穿透?

查询一个数据库中不存在的数据,由于数据库中没有该数据,因此也不会写入到redis中,导致每次请求该数据都要查询数据库。大量针对该数据的高并发请求可能会导致数据库挂掉。

三.如何解决缓存穿透?

方案一.缓存空数据

1.实施:对mysql中查询不到的数据,返回一个空值null,同时将该null值写入到redis中。

2.缺点:

(1)会消耗内存,无效数据一直占用内存;

(2)写入数据时可能会导致mysql与redis数据不一致的情况。

方案二.布隆过滤器

1.位图(bitmap):位图是一种以位(bit)为单位的数组,数组的每个单元只能存储二进制0或1

2.加了布隆过滤器后的查询流程:在对缓存进行预热时会先预热布隆过滤器,请求在查询redis前会先被布隆过滤器拦截,由布隆过滤器判断该数据是否存在,如果要查询的数据存在,则请求可以继续去查询redis;如果要查询的数据不存在,则直接返回。

3.布隆过滤器是通过位图来判断要查询的数据是否存在:

(1)对布隆过滤器进行预热时,会对每一个数据进行多个hash函数计算得到多个hash值,这些hash值作为数组的下标,将对应下标的值设为1;

(2)在查询时会对要查询的数据使用相同的hash函数计算得到多个hash值,并根据这些hash值作为下标去查询数组,只要有一个元素不为1则说明该数据不存在,直接返回。

(3)一个数据的存在情况在布隆过滤器中被分为多个部分,只有多个部分同时为1才说明这一个数据存在。布隆过滤器只能判断数据是否存在,无法存储数据,因此请求通过布隆过滤器后还要接着访问redis。

4.缺点:可能会由于hash冲突导致发生误判:当要查询的数据不存在,但经过hash计算后得到的点位全都被已存在数据使用并设为1时,该数据会被判定为存在。但是使用布隆过滤器,误判是一定存在的,数组越大,误判率就越小,但带来的内存消耗也更大,通常误判率只要在0.05以下就是可以接受的。

  • 缓存击穿

一.什么是缓存击穿?

给缓存中的某一个key设置了过期时间,当该key过期时,恰好有针对该key的大量并发请求,这些请求全部到达数据库,可能会导致数据库挂掉。

二.如何解决缓存击穿?

方案一.互斥锁

1.实施:互斥锁是用于锁对内存的缓存重建

(1)当线程1在缓存中查询不到目标数据时,会依次执行以下操作:

申请互斥锁;

进行缓存重建:查询数据库,查到目标数据后将数据返回,并将该数据写入内存;

释放互斥锁。

(2)此时如果有线程2查询缓存,并且也查询不到目标数据时,也会申请互斥锁进行缓存重建;但由于线程1正在占有互斥锁,因此线程2会陷入阻塞,直到线程1释放互斥锁,线程2获得互斥锁进行缓存重建后,才能将数据返回。

方案二.逻辑过期

1.实施:也需要用到互斥锁

(1)对缓存中的数据不设置过期时间,而是在数据的value部分添加一个字段作为逻辑时间,用于记录该数据的过期状态;

(2)当线程1在缓存中查到目标数据时,会根据该数据的逻辑时间判断该数据是否逻辑过期,如果该数据已经逻辑过期,则线程1会依次执行以下两步操作:

        a.申请互斥锁,新建一个子进程,进行缓存重建,释放互斥锁;

        b.将查询到的过期数据直接返回。

(3)此时若有一线程2在缓存中也查到了逻辑过期的数据,则线程2也会将这个过期数据直接返回,并申请互斥锁进行缓存重建;但由于线程1正占有互斥锁,因此线程2申请不到互斥锁进行缓存重建,但线程2不会就此阻塞,而是直接放弃缓存重建,继续执行其他操作。

三.互斥锁方案与逻辑过期方案的比较

1.互斥锁方案所有查询不到目标数据的线程都必须进行缓存重建,由于只能有一个线程申请到互斥锁,因此剩余线程都会阻塞,直到申请到互斥锁进行缓存重建后才能将数据返回。这样保证了数据的强一致性,即所有数据都是最新的数据;但也由于线程阻塞导致性能差。

2.逻辑过期方案每一次查询,无论该数据是否过期,都会直接返回在缓存中查到的数据,这样确保了高可用与性能优。但提高了查到过期数据的风险。

3.逻辑过期方案也有用到互斥锁,如果线程查到的数据已经过期,则会申请互斥锁,若申请到了则进行缓存重建;若申请不到则放弃,不会就此阻塞。

  • 缓存雪崩

一.什么是缓存雪崩?

同一时段缓存中的多个key同时失效或者redis服务宕机,导致大量请求到达数据库,可能会导致数据库挂掉。

二.缓存击穿与缓存雪崩

1.缓存击穿是一个key过期,针对该key的大量高并发请求到达数据库,造成数据库压力过大。

2.缓存雪崩是多个key同时过期,针对这些key的大量高并发请求到达数据库,造成数据库压力过大。

三.如何解决缓存雪崩?

1.给不同key的过期时间添加不同的值。

——如果是同一时段多个key同时失效,说明这些key的过期时间被设置成相同,因此要给不同key的ttl设置成不同值。

2.利用redis集群提高服务的可用性。

——例如使用哨兵模式、集群模式。

3.给缓存业务添加降级限流策略。

——在nginx或spring cloud gateway中设置。降级限流策略是一种保底操作,可用于缓存穿透、击穿、雪崩。

4.给业务添加多级缓存。

——例如使用Guava或Caffeine作为一级缓存,使用redis作为二级缓存。

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

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

相关文章

Driftingblues靶机系列Driftingblues5

获取靶机的ip:192.168.108.37 扫描靶机的端口服务: 看到web服务和ssh服务: 先查看一下web服务: 扫描到web服务的信息: 访问web服务: 在源代码中并没有看到有什么新的信息,扫描一下靶机目录:…

vue地址选择器-三级联选择器+详细地址

在页面的显示情况 前端拼接实现存储 具体实现步骤 1.安装中国全省市区的数据 在命令提示符窗口使用管理员身份进入对应vue项目的文件夹,在窗口安装 npm install element-china-area-data -S2.在script内引入安装的数据 import {regionData,codeToText } from…

从Flutter范儿的单例来看Dart的构造函数

点击上方蓝字关注我,知识会给你力量 单例模式 单例模式应该是设计模式中使用的最广泛的一种设计模式了,在Kotlin中,甚至为它单独创建了一个语法糖——object类,来快速实现单例模式,而在Dart中,并没有像Kotl…

某盾BLACKBOX逆向关键点

需要准备的东西: 1、原JS码 2、AST解混淆码 3、token(来源于JSON) 一、原JS码很好获取,每次页面刷新,混淆的代码都会变,这是正常,以下为部分代码 while (Qooo0) {switch (Qooo0) {case 110 14 - 55: {function O0…

Win10/11共享文件夹,访问提示需要输入用户名密码

Win10/11共享文件夹,访问提示需要输入用户名密码 问题 已经关闭了密码保护共享,但是局域网其他电脑访问该文件夹,提示需要输入用户名和密码 解决方法 操作步骤 1.按WINR键打开运行,输入gpedit.msc打开本地组策略编辑器 2.按如…

五种算法(BWO、RUN、SO、HO、GWO)求解复杂城市地形下无人机路径规划,可以修改障碍物及起始点(MATLAB)

一、算法介绍 (1)白鲸优化算法BWO 参考文献:Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022, 109215. (2)龙格-库塔优化…

【Android学习】简单的登录页面和业务逻辑实现

实现功能 1 登录页&#xff1a;密码登录和验证码登录 2 忘记密码页&#xff1a;修改密码 3 页面基础逻辑 java代码 基础页面 XML login_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.and…

Agent AI:智能代理的未来

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦梦梦梦 &#x1f64b;‍♂️ 小伙伴们如果在学习过程中有不明白的地方&#xff0c;欢迎评论区留言提问&#xff0c;小梦定知无不言&#xff0c;言无不尽。 目录 一、Agent AI的起源与发展 二、Agent A…

js,JavaScript 对象(2024-05-02)

对象是 JavaScript 的数据类型之一。 对象用于存储键/值&#xff08;名称/值&#xff09;集合。 JavaScript 对象是命名值的集合。 下例创建具有四个键/值属性的 JavaScript 对象&#xff1a; const person {firstName: "Bill",lastName: "Gates",age:…

Linux中的简单操作 ls/tar/pwd/cd/mkdir/touch 等

目录 前言 安装和卸载软件包 ls 查看指定路径下的文件和文件夹 tar 解压缩/压缩命令 pwd 查看当前路径 cd 改变目录 mkdir 创建目录 递归创建 rm rmdir 删除文件或目录 touch 创建文件 ll、echo、重定向符&#xff08;>,>>&#xff09; ll echo 重定向符…

嵌入式C语言高级教程:实现基于STM32的无线远程监控系统

无线远程监控系统可以广泛应用于安防、环境监测等领域&#xff0c;提供实时数据传输和警报功能。本教程将指导您如何在STM32微控制器上实现一个基本的无线远程监控系统。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32L476RG&#xff0c;特别适合低功耗应用。开发板…

MySQL数据库实验三

本文承接前面的俩次实验基础上完成&#xff0c;不过实现的都是基础操作的练习 目录 目录 前言 实验目的 实验要求 实验内容及步骤 updata操作 delete操作 alter操作 添加列 删除列 修改列的数据类型 要求实现 实验结果 代码结果 注意事项 思考题 总结 前言 本文是MySQL数据库…

c++11 lambda 捕获,匿名,返回类型后置

lambda就是即写即用的匿名函数&#xff0c;可以用于解决匹配函数参数的问题 int main(int argc,char *argv[]) {vector<int> v{1,2,3,4,5,6,7,8};for_each(v.begin(),v.end(),[](int a){cout<<a;});return 0; } for_each是固定函数&#xff0c;我们需要他但是又没…

MySQL中JOIN连接的实现算法

目录 嵌套循环算法&#xff08;NLJ&#xff09; 简单嵌套循环&#xff08;SNLJ&#xff09; 索引嵌套循环&#xff08;INLJ&#xff09; 块嵌套循环&#xff08;BNLJ&#xff09; 三种算法比较 哈希连接算法&#xff08;Hash Join&#xff09; 注意事项&#xff1a; 工…

分享5个免费AI一键生成毕业论文的网站

一、引言 对于忙碌的学生来说&#xff0c;毕业论文通常是一项艰巨的任务。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;现在有一些工具可以帮助学生轻松完成论文。本文将介绍五个免费的AI工具&#xff0c;它们能够一键帮助你生成毕业论文&#xff0c;让你的学术生…

Linux流程控制

if语句 基本格式 if condition thencommand1 fi 写成一行 if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi if-else语句 格式 if condition thencommand1 command2...commandN elsecommand fi if else- if else if condition1 th…

wordpress忘记后台密码,在数据库中修改回来,然后再修改回去。

源地址&#xff1a;https://www.ctvol.com/seoomethods/1421332.html 我们在做wordpess运维的时候&#xff0c;都会遇到很尴尬的时候&#xff0c;有时候在错误运维中&#xff0c;不知道删除了什么东西&#xff0c;造成wordpress后台不能登录&#xff0c;后台页面也直接失效&am…

Google Chrome浏览器便携增强版 v124.0.6367.61

01 软件介绍 Google Chrome v124.0.6367.61&#xff0c;这一版本经过精心设计&#xff0c;集成了一系列的功能增强和关键补丁&#xff0c;旨在提升用户体验。其中&#xff0c;Chrome引入了便携性数据保存选项&#xff0c;优化了标签页及标签栏的操作机制。此外&#xff0c;它还…

互联网黑话知所多少?

互联网黑话是互联网公司形成的一套带有浓厚互联网行业特色的“非正式语言”。这些黑话通常起源于社交媒体、网络论坛、技术博客以及职场交流中&#xff0c;它们可能是缩写词、行业术语、梗或者其它专业领域的词汇。来盘一盘你常听、常用的互联网黑话都有哪些吧&#xff01;

分布式与一致性协议之ZAB协议(七)

ZAB协议 ZAB协议:如何处理读写请求 你应该有这样的体会&#xff0c;如果你想了解一个网络服务&#xff0c;执行的第一个功能肯定是写操作&#xff0c;然后才会执行读操作。比如&#xff0c;你要了解ZooKeeper&#xff0c;那么肯定会在zkClient.sh命令行中执行写操作(比如crea…
最新文章