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.mzph.cn/bicheng/8770.shtml

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

相关文章

stm32f103zet6_RTC_1_介绍

RTC简介 实时时钟是一个独立的定时器。 RTC模块拥有一组连续计数的计数器,在相应软件配置下,可 提供时钟日历的功能。 修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复…

【Linux】常用基本指令

目录 食用说明 用户管理 whoami/who clear tree 目录结构和路径 pwd ls 文件 隐藏文件 常用选项 cd 家目录、根目录、绝对路径和相对路径 touch 常用选项 mkdir rmdir/rm man cp mv cat nano echo 输出重定向 > 输入重定向 < more/less head/…

C语言每日一练(12、水仙花数)

在编程的领域中&#xff0c;我们常常会遇到一些有趣而富有挑战性的问题。今天&#xff0c;让我们一起来探讨一个经典的编程题目——打印出所有的“水仙花数”。 所谓“水仙花数”&#xff0c;是指一个三位数&#xff0c;其各位数字的立方和等于该数本身。例如&#xff0c;153 …

springBoot异常总结

1.springBoot的主类和springBoot的 测试类名相同: .springBoot的主类和springBoot的 测试类名相同报异常&#xff1a; java.lang.ClassNotFoundException: junit.framework.ComparisonFailure //当src/main/java文件夹下有与src/test/java文件夹下相同名字的类时&#xff0c;…

csapp proxy lab part 1

host, hub, 路由器&#xff0c;和 交换机 当手机连接到局域网中时&#xff0c;它需要找到网络中的交换机&#xff08;Switch&#xff09;。这通常是通过 DHCP&#xff08;动态主机配置协议&#xff09;完成的。DHCP服务器负责向手机分配IP地址、子网掩码、网关地址等网络配置信…

ic基础|时钟篇02:关于时钟分频器的二三事

大家好&#xff0c;我是数字小熊饼干&#xff0c;一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结&#xff0c;并通过汇总成文章的形式进行输出&#xff0c;相信无论你是在职的还是…

【js开发记录笔记】js开发记录笔记

整理的函数以及注意点 css 强制!important includes 函数 //示例&#xff1a; Input: [1, 2, 3, 4, 5].includes(2); Output: true;Input: [1, 2, 3, 4, 5].includes(9); Output: false;方法 1.同步方法获取接口返回值: new Promise((resolve) > {dataList this.Addtree…

pgsql和mysql比较

pgsql相对于mysql的优势主要体现在以下几个方面&#xff1a; 稳定性和可靠性&#xff1a;PostgreSQL的稳定性极强&#xff0c;即使在崩溃、断电等灾难场景下也能表现出很好的抗打击能力。相比之下&#xff0c;很多MySQL用户都遇到过Server级的数据库丢失的情况。此外&#xff…

windows驱动开发-32位和64位

这部分其实是过时的知识点&#xff0c;毕竟win 11之已经不支持32位系统了&#xff0c;但是还是列出来吧。 32位主要是指x86体系&#xff0c;在早期&#xff0c;32位的应用程序和系统只支持4GB的内存地址寻址&#xff0c;这也是最大的特色之一&#xff0c;在那个时代&#xff0…

嵌入式开发八:STM32启动过程分析

本次给大家分析 STM32F4 的启动过程&#xff0c;这里的启动过程是指从 STM32 芯片上电复位执行的第一条指令开始&#xff0c;到执行用户编写的 main 函数这之间的过程。我们编写程序&#xff0c;基本都是用 C 语言编写&#xff0c;并且以 main 函数作为程序的入口。但是事实上&…

1.使用uniapp搭建微信小程序项目并引入前端组件资源

文章目录 1. 项目配置1.1. 新建vue3项目1.2. 关联云空间1.3. 运行到微信开发者工具 2. 前端组件2.1. uniCloud的内置组件和扩展组件2.2. uView3.02.3. 在uniapp项目引入uview3 1. 项目配置 1.1. 新建vue3项目 由于我们要使用vue3而不是vue2&#xff0c;所以要选好版本&#x…

CMakeLists.txt语法规则:条件判断中表达式说明四

一. 简介 前面学习了 CMakeLists.txt语法中的 部分常用命令&#xff0c;常量变量&#xff0c;双引号的使用。 前面几篇文章也简单了解了 CMakeLists.txt语法中的条件判断&#xff0c;文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;条件判断说明一-CSDN博客 CMa…

【GPT调用】本地使用python调用GPT接口

python调用GPT接口 环境变量设置主调用方法执行结果 环境变量设置 .env文件中配置GPT环境变量 api_key"你的GPT-API-KEY" urlhttps://ai-proxy.ksord.com/wps.openai.azure.com/openai/deployments/gpt-4-32k/chat/completions?api-version2023-09-01-preview主调…

中国结(科普)

中国结是一种手工编织工艺品&#xff0c;它身上所显示的情致与智慧正是汉族古老文明中的一个侧面。 [1]它原本是由旧石器时代的缝衣打结&#xff0c;后推展至汉朝的仪礼记事&#xff0c;再演变成今日的装饰手艺。周朝人随身的佩戴玉常以中国结为装饰&#xff0c;而战国时代的铜…

1756jsp农产品销售管理系统Myeclipse开发mysql数据库C2C模式java编程计算机网页项目沙箱支付

一、源码特点 java 农产品销售管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0…

天龙怀旧游戏python脚本

设置图&#xff1a; 游戏窗口最大化。 海贼洞这里定位你要回点的定位。 运行bat就行&#xff0c;脚本出错了还是会重新运行脚本&#xff0c;运行自动启动&#xff0c;end暂停脚本&#xff0c;home重新启动脚本 1. 我常用的是内挂回点脚本&#xff0c; 下面都是前台脚本&…

Java - 分布式逻辑事务的一些轻操作

前提条件 可控业务在不可控业务前不可控业务自己保证数据回滚一致性 设计思路 若可控业务A失败&#xff0c;则不发送给不可控业务B&#xff0c;直接回滚&#xff1b;若可控业务A成功&#xff0c;发送给不可控业务B&#xff0c;B处理完返回标记&#xff0c;B成功&#xff0c;则…

Python-100-Days: Day09 Object-oriented programming(OOP) Upgrade

1.property装饰器 之前有讨论过&#xff0c; Python中属性和方法访问权限的问题&#xff0c;不建议将属性设置为私有的&#xff0c;倘若直接将属性暴露给外界也是存在问题的。例如&#xff0c;我们没有办法检查赋给属性的值是否有效。之前的建议是将属性命名以单下划线开头&am…

C#贪吃蛇

C#贪吃蛇 文章目录 Program.csText1Game.csISceneUpdate.csText2BeginScene.csBegionOrEndScene.csEndScene.csGameScene.csText3GameObject.csIDraw.csPosition.csText4Food.csSnakeBody.csWall.csText5Map.csText6Snake.csProgram.cs using 贪吃蛇.Text1;Game game = new Ga…

Chapter 1-19. Introduction to Congestion in Storage Networks

Q: What effects does NVMe over Fabrics have on network congestion? All environments are different; hence a general answer is not possible. 所有的环境都是不同的,因此不可能给出一个笼统的答案。 The high amount of parallelism of NVMe may increase network u…