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

news/2024/5/20 17:29:13
  • 缓存穿透

一.数据查询的流程

程序根据请求查询数据时,会先到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.mrgr.cn/p/38587777

相关文章

基于springboot实现医院药品管理系统项目【项目源码+论文说明】

基于springboot实现医院药品管理系统演示 摘要 身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就…

AI 绘画神器 Fooocus 本地部署指南:简介、硬件要求、部署步骤、界面介绍

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 随着人工智能技术的飞速发展,AI 绘画逐渐成为创意领域的新宠。Fooocus 作为一款免费开源的 AI 绘画工具&am…

一文玩转Vue3参数传递——全栈开发之路--前端篇(8)

全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇:setup语法,设置响应式数据。 第四篇:数据绑定、计算属性和watch监视 第五篇 : 组件…

测试项目实战——安享理财1(测试用例)

说明: 1.访问地址: 本项目实战使用的是传智播客的安享理财项目(找了半天这个项目能免费用且能够满足测试实战需求) 前台:http://121.43.169.97:8081/ 后台:http://121.43.169.97:8082/ (点赞收藏…

20240503解决Ubuntu20.04和WIN10双系统下WIN10的时间异常的问题

20240503解决Ubuntu20.04和WIN10双系统下WIN10的时间异常的问题 2024/5/3 9:33 缘起:因为工作需要,编译服务器上都会安装Ubuntu20.04。 但是因为WINDOWS强悍的生态系统,偶尔还是有必须要用WINDOWS的时候,于是也安装了WIN10。 双系…

什么是虚拟货币?

随着科技的进步,虚拟货币逐渐进入公众视野,其影响深远且复杂。本文将从专业角度分析虚拟货币的发展现状、未来趋势,以及面临的挑战,并尝试提出一些思考。 一、虚拟货币的定义与现状 虚拟货币是一种基于区块链技术的数字资产&…

欧洲杯/奥运会-云直播

欧洲杯/奥运会要来了,如何升级自己的网站让你的顾客都能观赏直播已提高用户量呢?! 【功能完善、平滑兼容】 云直播支持 RTMP 推流、 HLS 源站等多种直播源接入方式,提供直播 SDK,支持多终端适配,上行码率…

【C++】详解STL容器之一的deque和适配器stack,queue

目录 deque的概述 deque空间的结构 deque的迭代器 deque的数据设计 deque的优缺点 适配器的概念 ​编辑 stack的概述 stack的模拟实现 queue的概述 queue的模拟实现 deque的概述 deque的设计参考了另外两大容器vector和list。可参考下面两篇文章 详解vector&#x…

【LLM 论文】Least-to-Most Prompting 让 LLM 实现复杂推理

论文:Least-to-Most Prompting Enables Complex Reasoning in Large Language Models ⭐⭐⭐ Google Research, ICLR 2023 论文速读 Chain-of-Thought(CoT) prompting 的方法通过结合 few-show prompt 的思路,让 LLM 能够挑战更具…

漏洞管理是如何在攻击者之前识别漏洞从而帮助人们阻止攻击的

漏洞管理 是主动查找、评估和缓解组织 IT 环境中的安全漏洞、弱点、差距、错误配置和错误的过程。该过程通常扩展到整个 IT 环境,包括网络、应用程序、系统、基础设施、软件和第三方服务等。鉴于所涉及的高成本,组织根本无法承受网络攻击和数据泄露。如果…

【springboot基础】如何搭建一个web项目?

正在学习springboot,还是小白,今天分享一下如何搭建一个简单的springboot的web项目,只要写一个类就能实现最基础的前后端交互,实现web版helloworld ,哈哈,虽然十分简陋,但也希望对你理解web运作…

python 和 MATLAB 都能绘制的母亲节花束!!

hey 母亲节快到了,教大家用python和MATLAB两种语言绘制花束~这段代码是我七夕节发的,我对代码进行了简化,同时自己整了个python版本 MATLAB 版本代码 function roseBouquet_M() % author : slandarer% 生成花朵数据 [xr,tr]meshgrid((0:24).…

STM32使用L9110驱动电机自制小风扇

1.1 介绍: 该电机控制模块采用L9110电机控制芯片。该芯片具有两个TTL/CMOS兼容输入端子,并具有抗干扰特性:具有高电流驱动能力,两个输出端子可直接驱动直流电机,每个输出端口可提供750800mA动态电流,其峰值…

AlphaFold3: Google DeepMind的的新突破

AlphaFold 3的论文今天在Nature期刊发表啦!这可是AI在生物领域最厉害的突破的最新版本。AlphaFold-3的新招就是用扩散模型去"画出"分子的结构。它一开始先从一团模模糊糊的原子云下手,然后慢慢透过去噪把分子变得越来越清楚。 Alphafold3 我们活在一个从Llama和Sora那…

【C++】string类的使用

目录 string类对象的默认成员函数 string类对象的容量操作 string中元素访问及遍历 遍历方式1:下标[] 遍历方式2: 迭代器 遍历方式3: 范围for string类对象的修改操作 string类非成员函数 总结 string,也就是串或者字符数组,可以扩容&a…

第十届山东省大学生程序设计竞赛题解(A、F、M、C)

部分代码define了long long,请记得开long long A. Calandar 把年份、月份、单个的天数全都乘以对应的系数转化成单个的天数即可,注意最后的结果有可能是负数,要转化成正数。发现技巧是:(ans % 5 + 5) % 5。? 还有注意不能这样写,答案不正确。或许是因为取模运算没有这样的…

jmeter后置处理器提取到的参数因为换行符导致json解析错误

现象: {"message":"JSON parse error: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Ill…

网页主题自动适配:网页跟随系统自动切换主题

主题切换是网站设计中一个非常有趣的功能,它允许用户在多种预先设计的样式之间轻松切换,以改变网站的视觉表现。最常见的就是白天和黑夜主题的切换,用户可以根据自己的喜好进行设置。 除了让用户手动去切换主题外,如果能够让用户第…

(七)JSP教程——session对象

浏览器和Web服务器之间的交互通过HTTP协议来完成,HTTP协议是一种无状态的协议,服务器端无法保留浏览器每次与服务器的连接信息,无法判断每次连接的是否为同一客户端。为了让服务器端记住客户端的连接信息,可以使用session对象来记…

基于springboot+jsp+Mysql的商务安全邮箱邮件收发

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…