论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
Redis中的缓存穿透,缓存击穿和缓存雪崩 ...
Redis中的缓存穿透,缓存击穿和缓存雪崩
没腿的鸟
金牌会员
|
6 天前
|
显示全部楼层
|
阅读模式
楼主
主题
861
|
帖子
861
|
积分
2583
概述
缓存击穿、缓存穿透、缓存雪崩这三个题目是Reids在实际项目中会经常遇到题目,同时,这三个题目也是口试的热点题目,下面,就本篇文章搞懂缓存穿透、缓存击穿、缓存雪崩三大题目标原因及解决方法。
Redis在项目中作为缓存中心件是如何工作的?如图所示
客户端发起一个查询请求的时候,首先去缓存中查询,如果数据在缓存中存在,则直接将缓存中的数据返回给客户端;如果数据在缓存中不存在,则继续查询数据库,如果数据在数据库中存在,则将该数据放入缓存中,并返回给客户端,如果数据在数据库中也不存在,则直接返回null给客户端。
1.缓存穿透
1.1 什么是缓存穿透
缓存穿透是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,末了返回空。当用户使用这条不存在的数据疯狂发起查询请求的时候,对数据库造成的压力就非常大,甚至大概直接挂掉。这种情况的流程就变成下图如许了:
1.2 解决方案
解决缓存穿透的方法一般有两种,第一种是缓存空对象,第二种是使用布隆过滤器。
1.2.1 缓存空对象
第一种方法比较好明白,就是当数据库中查不到数据的时候,我缓存一个空对象,然后给这个空对象的缓存设置一个过期时间,如许下次再查询该数据的时候,就可以直接从缓存中拿到,从而到达了减小数据库压力的目标。
但这种解决方式有两个缺点:
(1)需要缓存层提供更多的内存空间来缓存这些空对象,当这种空对象许多的时候,就会浪费更多的内存;
(2)会导致缓存层和存储层的数据不一致,即使在缓存空对象时给它设置了一个很短的过期时间,那也会导致这一段时间内的数据不一致题目。
1.2.2 布隆过滤器
使用布隆过滤器,这是比较推荐的方法。所谓布隆过滤器,就是一种数据结构,它是由一个长度为m bit的位数组与n个hash函数组成的数据结构,位数组中每个元素的初始值都是0。在初始化布隆过滤器时,会先将全部key进行n次hash运算,如许就可以得到n个位置,然后将这n个位置上的元素改为1。如许,就相称于把全部的key生存到了布隆过滤器中了。
举个例子,好比我们一共有3个key,我们对这3个key分别进行3次hash运算,key1颠末三次hash运算后的效果分别为2/6/10,那么就把布隆过滤器中下标为2/6/10的元素值更新为1,然后再分别对key2和key3做同样操作,效果如下图:
如许,当客户端查询时,也对查询的key做3次hash运算得到3个位置,然后看布隆过滤器中对应位置元素的值是否为1,如果全部对应位置元素的值都为1,就证明key在库中存在,则继续向下查询;如果3个位置中有任意一个位置的值不为1,那么就证明key在库中不存在,直接返回客户端空即可。如下图:
当客户端查询key4时,key4的3次hash运算中,有一个位置8的值为0,就说明key4在库中不存在,直接返回客户端空即可。
所以,布隆过滤器就相称于一个位于客户端与缓存层中心的拦截器一样,负责判断key是否在集合中存在。如下图:
布隆过滤器的好处就是解决了第一种缓存空值的不敷,但布隆过滤器也存在缺陷,
首先,它有误判的大概,好比在上面客户端查询key4的图中,假如key4颠末3次hash运算得到的位置分别是2/4/6,由于这3个位置的值都是1,所以,布隆过滤器就认为key4在库中存在,进而继续向下查询了。所以,布隆过滤器判断存在的key实际上大概是不存在的,但布隆过滤器判断不存在的key是肯定不存在的。
它的第二个缺点就是删除元素比较难,好比现在要删除key2这个元素,那么需要将2/7/11三个位置的元素值改为0,但如许就会影响到key1和key3的判断。
2.缓存击穿
2.1 什么是缓存击穿
缓存击穿是指当缓存中某个热点数据过期了,在该热点数据重新载入缓存之前,有大量的查询请求穿过缓存,直接查询数据库。这种情况会导致数据库压力瞬间骤增,造成大量请求阻塞,甚至直接挂掉。
2.2 解决方案
解决缓存击穿的方法也有两种,第一种是设置key永不外期;第二种是使用分布式锁,保证同一时刻只能有一个查询请求重新加载热点数据到缓存中,如许,其他的线程只需等候该线程运行完毕,即可重新从Redis中获取数据。
2.2.1 热点Key值永不外期
第一种方式比较简单,在设置热点key的时候,不给key设置过期时间即可。不外另有别的一种方式也可以到达key不外期的目标,就是正常给key设置过期时间,不外在后台同时启一个定时任务去定时地更新这个缓存。
2.2.2 分布式锁并发更新
第二种方式使用了加锁的方式,锁的对象就是key,如许,当大量查询同一个key的请求并发进来时,只能有一个请求获取到锁,然后获取到锁的线程查询数据库,然后将效果放入到缓存中,然后释放锁,此时,其他处于锁等候的请求即可继续执行,由于此时缓存中已经有了数据,所以直接从缓存中获取到数据返回,并不会查询数据库。
3.缓存雪崩
3.1 什么是缓存雪崩
缓存雪崩是指当缓存中有大量的key在同一时刻过期,大概Redis直接宕机了,导致大量的查询请责备部到达数据库,造成数据库查询压力骤增,甚至直接挂掉。
3.2 解决方案
针对第一种大量key同时过期的情况,解决起来比较简单,只需要将每个key的过期时间打散即可,使它们的失效点尽大概均匀分布。
针对第二种redis发生故障的情况,部署redis时可以使用redis的几种高可用方案部署
除了上面两种解决方式,还可以使用其他策略,好比设置key永不外期、加分布式锁等。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
没腿的鸟
金牌会员
这个人很懒什么都没写!
楼主热帖
CVE-2022-23131 Zabbix SAML SSO认证绕 ...
【ollama】Linux下更改ollama模型下载 ...
iOS全埋点解决方案-采集崩溃 ...
ManageEngine ServiceDesk Plus之CVE漏 ...
Doris(七) -- 修改表、动态和临时分区 ...
Redis事务
【密码管理器】上海道宁为您提供存储和 ...
java代码审计-XSS
【必知必会的MySQL知识】④DCL语言 ...
北斗授时产品(GPS北斗授时设备)加NTP ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表