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、解决方案
(1)redis高可用
这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续作业,其实就是搭建的集群,
(2)限流降级
这个解决方案的思想是,在快取失效后,通过加锁或者队列来控制读数据库写快取的执行绪数量,比如对某个key只允许一个执行绪查询资料和写快取,其他执行绪等待,
(3)资料预热
资料加热的含义就是在正式部署之前,我先把可能的资料先预先访问一遍,这样部分可能大量访问的资料就会加载到快取中,在即将发生大并发访问前手动触发加载快取不同的key,设定不同的过期时间,让快取失效的时间点尽量均匀,
0 评论