缓存穿透、缓存击穿、缓存雪崩

目录

一、缓存的概念

1.为什么需要把用户的权限放入redis缓存

2.为什么减低了数据库的压力呢?

3.那么什么情况下用redis,什么情况下用mysql呢?

4.关于权限存入redis的逻辑?

二、使用缓存出现的三大情况

1.缓存穿透

1.1概念

1.2出现原因

1.3解决办法

1.4特点

2.缓存击穿(与缓存穿透容易记混,击穿的威力大,所有请求打在一个key上,直接把缓存穿掉了)

        2.2解决办法

        2.3特点

3.缓存雪崩

3.1概念

3.2解决办法

三、缓存预热

四、缓存更新

1.使用缓存存在数据一致性问题

2.如何保证最终数据一致性


一、缓存的概念

1.为什么需要把用户的权限放入redis缓存

因为用户的权限是一个读大于写的操作,所以对用户权限的查询就不必说每次都去Mysql数据库中查询,可以将第一次查询的结果放入redis缓存中,这样就减少了数据库的交互,降低了给数据库带来的压力,并且提高了查询速度

2.为什么减低了数据库的压力呢?

因为数据库可以接受的同时访问数量为5000,如果在高并发的情况下去查询同一个用户的权限,那么很可能导致数据库承受不住这个访问的压力,所以将第一次查询的结果放入redis缓存中,先从redis缓存中查询数据,redis缓存可以接受在高并发的情况下最大访问数为十万,并且redis的数据是存储在内存中的,而mysql的数据是存储在硬盘中的需要进行IO读写,所以redis读取数据会比mysql快,所以效率就高

3.那么什么情况下用redis,什么情况下用mysql呢?

这就要说mysql和redis的区别了,mysql是关系型数据库,它里面的关系都是由表和字段组成,并且还可以存在约束关系,哪怕某个数据为空,它也是存在表中的,他是一个表的部分

redis是非关系型数据库,它里面都是通过键值对存储数据的,所以它数据的展示可以是不规则的,它可以只存储有必要的数据,而mysql哪怕为空也是在表中显示的

并且 mysql是持久型数据库,数据存储硬盘,它可以做一些持久化的操作,存储永久和真实重要的数据

redis是缓存型数据库,它的数据存储在内存,所以它可以做一些计算

其实关于它们的使用 一般是结合使用,通过redis首先做一道缓存,提高效率和降低数据库压力,

mysql做持久化,保证数据的真实性和安全性,当我们需要的数据必须是真实可靠的,这个时候就可以直接去数据库中查询

4.关于权限存入redis的逻辑?

首先对于查询权限的请求,先去redis缓存中中查找是否有这个用户的权限,如果有这个权限那么直接将这个权限返回给调用者,如果缓存中没有这个用户的权限,那么就去数据库中找,如果数据库中有数据,那么直接返回给调用者,如果数据库中也没有用户的权限,那么在缓存中设置一个默认值,下次同样的请求发过来,直接从redis缓存中取用户的权限,如果是默认值,说明数据库也没有这个权限,这个时候就可以不必去查找数据库了,这样就提高了查询效率并且解决了因为缓存中没有权限而每次去访问数据库给数据库带来的压力,也就是缓存击透

二、使用缓存出现的三大情况

1.缓存穿透

1.1概念

缓存穿透:就是指查询请求每次都无法在缓存中找到对应的数据,缓存失效,导致每次请求都直接打到了数据库,即使数据库中也不存在相应的数据,也会对数据库进行频繁查询,这会增加数据库的压力,降低系统性能

1.2出现原因

恶意请求、随机查询等原因引起的

1.3解决办法

(1)设置默认值并且设置较短的过期时间

     当从缓存中得到的是一个默认值,说明数据库也没有我们要查询的数据,所以我们直接         不去数据库中查了,并且设置较短的过期时间,以防止缓存中一直保存无效数据(保证         数据的最终一致性

1.4特点

缓存没有要查询的数据,数据库也没有要查询的数据

2.缓存击穿(与缓存穿透容易记混,击穿的威力大,所有请求打在一个key上,直接把缓存穿掉了)

2.1概念

在并发的情况下,大量的请求同时访问redis缓存中的一个热点key,而这个热点key已经过期了,所以导致所有请求打到了数据库,导致数据库对同一条数据进行了多次查询操作

2.2解决办法

(1)锁机制:当多个请求过来的时候,调用方法从redis中中获取数据,如果redis获取的数据为空,那么就加锁,得到锁资源后,然后再去redis缓存中获取一次,如果redis获取的数据为空,那么去mysql中获取数据,然后存入redis,如果并不为空则返回数据;如果没有得到锁资源,那么递归方法;

(2)布隆过滤器:可以判断出这个数据可能存在和一定不存在

         为什么布隆过滤器可以判断:因为底层是一个hash结构(数组+链表)。

当我们查询一个数据(key)的时候,可以根据hash算法得到它的hash值,然后根据hash值去hash数组中找到这个位置,看这个位置是否有值,如果没有值,说明数据一定不存在,不用去数据库中找了,如果有值说明可能存在,因为数组里面一个链表,有值并不代表是我们要找的数据

如果出现了hash碰撞并且这个链表上有数据就说明有可能存在,可以去查询数据库。

2.3特点

缓存中没有要查询的数据,数据库中有要查询的数据

3.缓存雪崩

3.1概念

在同一个时间点上大量的key同时过期,同时有大量的请求查询这些key,导致缓存没有命中,都打到了数据库,给数据库带来了巨大的压力,甚至宕机

3.2解决办法

给每个key设置不同的过期时间,让它们分时间段的过期

那样就不会导致同一时间大量的请求打到数据库

三、缓存预热

有预估性的知道某些数据可能会被大量的访问,所以可以进行缓存预热,提前将数据从数据库中取出存入缓存中,提高查询效率

四、缓存更新

1.使用缓存存在数据一致性问题

使用了缓存那么必然就会存在一个redis缓存与mysql数据库之间的一个数据一致性问题

因为他们是两个数据库,我们无法保证它们的操作都能同时执行成功,无法保证它们的原子性,所以我们只需要保证它们的最终一致性就好了,某个时间段数据不一致没关系

2.如何保证最终数据一致性

(1)当mysql的数据发生修改后,我们需要把缓存中的数据删除

(2)给key设置一个过期时间,让它自己到期删除

并且在需要真实可靠的数据的时候我们可以直接查询数据库确保数据的真实性

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

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

相关文章

2023/11/15JAVA学习

如何多开一个程序

企业设备巡检的痛点和解决方案

在设备巡检过程中,企业常面临多种痛点。首先,信息管理不足是一个关键问题,企业往往缺乏全面、准确的设备信息记录,这导致巡检工作缺乏针对性和效率。其次,巡检流程的非标准化使得巡检结果出现不一致,重要的…

RGB转Bayer,一个小数点引发的血案

前几天写了一个RGB数据转Bayer格式的函数,经过测试功能正常。后来把这个函数用到一个数据库构建中,结果数据库出来的结果一直是一张黑图,追查了好几个小时,总算把这只虫子找出来了,原来是一个整数后面的小数点作祟。 …

Docker 和 Kubernetes:技术相同和不同之处

Docker和Kubernetes是当今最流行的容器化技术解决方案。本文将探讨Docker和Kubernetes的技术相似之处和不同之处,以帮助读者更好地理解这两种技术。 Docker和Kubernetes:当今最流行的容器化技术解决方案 在当今的IT领域,Docker和Kubernetes无…

阿里云99元VS腾讯云88元,双11云服务器价格战,谁胜谁负?

在2023年的双十一优惠活动中,阿里云推出了一系列令人惊喜的优惠活动,其中包括99元一年的超值云服务器。本文将带您了解这些优惠活动的具体内容,以及与竞争对手腾讯云的价格对比,助您轻松选择最适合的云服务器。 99元一年服务器优…

23000 个恶意流量代理的 IPStorm 僵尸网络被拆除

美国司法部今天宣布,联邦调查局取缔了名为 IPStorm 的僵尸网络代理服务的网络和基础设施。 IPStorm 使网络犯罪分子能够通过世界各地的 Windows、Linux、Mac 和 Android 设备匿名运行恶意流量。 与此案相关的俄罗斯裔摩尔多瓦籍公民谢尔盖马基宁 (Sergei Makinin)…

传统工艺的数字时代转变:十八数藏的文化创新

在传统工艺和数字时代的交汇之处,十八数藏以其独特的文化创新走在了前列。这场数字时代的转变为传统工艺注入了新的生命和活力。 十八数藏的文化创新并非简单的数字应用,而是一场深刻的转变。通过数字技术,传统工艺被赋予了新的表达方式&…

【echarts】实现单线与多线滚轮联动、隐藏拖拽、关闭动画

单线滚轮联动 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>ECharts DataZoom</title><script src"https://cdn.jsdelivr.net/npm/echarts5.2.0/dist/echarts.min.js"></script> </hea…

一文图解爬虫_姊妹篇(spider)

—引导语 爬虫&#xff0c;没有一个时代比当前更重视它。一个好的爬虫似乎可以洞穿整个互联网&#xff0c;“来装满自己的胃”。 接上一篇&#xff1a;一文图解爬虫&#xff08;spider&#xff09; 博主已初步对爬虫的“五脏六腑”进行了解剖。虽然俗称“爬虫”&#xff0c;但窃…

【科研新手指南3】chatgpt辅助论文优化表达

chatgpt辅助论文优化表达 写在最前面最终版什么是好的论文整体上&#xff1a;逻辑/连贯性细节上一些具体的修改例子 一些建议&#xff0c;包括具体的提问范例1. 明确你的需求2. 提供上下文信息3. 明确问题类型4. 测试不同建议5. 请求详细解释综合提问范例&#xff1a; 常规技巧…

区域入侵AI算法如何应用在工地场景,保卫工地施工安全?

在工地、厂区等施工场所&#xff0c;安全保障是必不可少的&#xff0c;特别是在人工智能技术日益成熟的今天&#xff0c;如何利用旭帆科技AI智能视频中的区域入侵算法助力智慧工地、保障工地安全呢&#xff1f; 1、建筑物周界安全 TSINGSEE青犀区域入侵算法可以用于监控建筑物…

向量矩阵范数pytorch

向量矩阵范数pytorch 矩阵按照某个维度求和&#xff08;dim就是shape数组的下标&#xff09;1. torch1.1 Tensors一些常用函数 一些安装问题cd进不去不去目录PyTorch里面_表示重写内容 在默认情况下&#xff0c;PyTorch会累积梯度&#xff0c;我们需要清除之前的值 范数是向量或…

猫罐头哪种好吃又健康?精选5款营养美味的猫罐头推荐!

不知不觉开宠物店已经7年啦&#xff0c;店里的猫猫大大小小也算是尝试过很多品牌的猫罐头了。一开始选购猫罐头我也是踩了很多坑&#xff0c;各种踩雷。猫罐头的各种门道还是很难摸索的&#xff0c;新手养猫一不小心就会着道了。 作为一个从业宠物行业7年的人&#xff0c;我将给…

新一轮SocialFi浪潮来袭,Atem Network 再次打响注意力争夺战

火爆如潮的 Atem Network 再次从 CyberConnect 以及 Friend.tech 手中接过 SocialFi 赛道的热度大棒&#xff0c;同时这也表明&#xff0c;协议层仍将是 Web3 社交领域的主要叙事。 前不久&#xff0c;Web3社交协议Atem Network 在白皮书中披露了ATEM的代币经济模型&#xff0c…

学习c#的第十三天

目录 C# 多态性 静态多态性 函数重载 运算符重载 动态多态性 virtual 和 abstract 抽象方法和虚方法的区别 重载(overload)和重写(override) 隐藏方法 C# 多态性 多态是同一个行为具有多个不同表现形式或形态的能力。 多态性意味着有多重形式。在面向对象编程范式中…

美国站群服务器IP如何设置分配?

​  在配置美国站群服务器时&#xff0c;IP的分配是一个重要的步骤。下面将介绍一些关于美国站群服务器IP分配的相关知识。 独享IP和虚拟IP 在租用美国站群服务器之前&#xff0c;我们需要了解提供的IP是独享的还是虚拟的。独享IP指每个网站都有独立的IP地址&#xff0c;而虚…

nginx-静态资源实践(压缩配置,常见静态资源配置)

Nginx 实战搭建一个静态资源web服务器 第一个阶段访问单个文件 listen 80; #监听的端口 server_name localhost; #服务名称 #配置路径映射 location /geotools/ {alias geotools/; #将geotools/ 和/geotools/路径一一对应起来 }目录关系如下&#xff1a; nginx下面建一个g…

day59【单调栈】503.下一个更大元素Ⅱ 42.接雨水 84.柱状图中最大的矩形

文章目录 503.下一个更大元素Ⅱ42.接雨水 503.下一个更大元素Ⅱ 力扣题目链接 代码随想录讲解链接 题意&#xff1a;给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数…

并发编程之生产者消费者模型

什么是生产者消费者模型 生产者消费者模型是多线程中一个比较典型的模型。 打个比方&#xff1a;你是一个客户&#xff0c;你去超市里买火腿肠。 这段话中的 "你"就是消费者&#xff0c; 那么给超市提供火腿肠的供货商就是生产者。超市呢&#xff1f;超市是不是被…

【学习笔记】 - GIT的基本操作,IDEA接入GIT以及上传hub

用github蛮多&#xff0c;但git没怎么用&#xff0c;看着视频对着写点笔记以及操作 一、GIT文件的三种状态和模式 已提交(committed) 已提交表示数据已经安全的保存在本地数据库中。 已修改(modified) 已修改表示修改了文件&#xff0c;但还没保存到数据库中。…