拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 碰上Redis快取穿透、快取雪崩,就这幺解决...

碰上Redis快取穿透、快取雪崩,就这幺解决...

白鹭 - 2022-02-22 1940 0 0

Redis快取穿透

相关视频教程(来自动力节点):https://www.bilibili.com/video/BV1Uz4y1X72A

相关资料下载:http://www.bjpowernode.com/?cnblogs

一、快取穿透

1. 概念

快取穿透的概念很简单,用户想要查询一个资料,发现redis存储器数据库没有,也就是快取没有命中,于是向持久层数据库查询,发现也没有,于是本次查询失败,当用户很多的时候,快取都没有命中,于是都去请求了持久层数据库,这会给持久层数据库造成很大的压力,这时候就相当于出现了快取穿透,

这里需要注意和快取击穿的区别,快取击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破快取,直接请求数据库,就像在一个屏障上凿开了一个洞,  

2. 解决方案

1)布隆过滤器

布隆过滤器是一种资料结构,垃圾网站和正常网站加起来全世界据统计也有几十亿个,网警要过滤这些垃圾网站,总不能到数据库里面一个一个去比较吧,这就可以使用布隆过滤器,假设我们存盘一亿个垃圾网站地址,

有一天网警查到了一个可疑的网站,想判断一下是否是XX网站,首先将可疑网站通过哈希映射到1亿个位元阵列上的8个点,如果8个点的其中有一个点不为1,则可以判断该元素一定不存在集合中,

那这个布隆过滤器是如何解决redis中的快取穿透呢?很简单首先也是对所有可能查询的自变量以hash形式存盘,当用户想要查询的时候,使用布隆过滤器发现不在集合中,就直接丢弃,不再对持久层查询,

 

这个形式很简单,

2)快取空物件

当存盘层不命中后,即使回传的空物件也将其快取起来,同时会设定一个过期时间,之后再访问这个资料将会从快取中获取,保护了后端资料源;

    

但是这种方法会存在两个问题:

  • 如果空值能够被快取起来,这就意味着快取需要更多的空间存盘更多的键,因为这当中可能会有很多的空值的键;
  • 即使对空值设定了过期时间,还是会存在快取层和存盘层的资料会有一段时间视窗的不一致,这对于需要保持一致性的业务会有影响,

二、快取雪崩

1、概念

快取雪崩是指,快取层出现了错误,不能正常作业了,于是所有的请求都会达到存盘层,存盘层的呼叫量会暴增,造成存盘层也会挂掉的情况,

2解决方案

1redis高可用

这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续作业,其实就是搭建的集群,

2)限流降级

这个解决方案的思想是,在快取失效后,通过加锁或者队列来控制读数据库写快取的执行绪数量,比如对某个key只允许一个执行绪查询资料和写快取,其他执行绪等待,

3)资料预热

资料加热的含义就是在正式部署之前,我先把可能的资料先预先访问一遍,这样部分可能大量访问的资料就会加载到快取中,在即将发生大并发访问前手动触发加载快取不同的key,设定不同的过期时间,让快取失效的时间点尽量均匀,

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *