一、缓存穿透
1、概念
缓存穿透的概念很简单,
用户想要
查询一个数据,发现re
dis内存
数据库没有,也就是缓存没有命中,于是向持久层
数据库查询。发现也没有,于是本次
查询失败。当
用户很多的时候,缓存都没有命中,于是都去请求了持久层
数据库。这会给持久层
数据库造成很大的压力,这时候就相当于出现了缓存穿透。
这里需要注意和缓存击穿的区别,缓存击穿,是指
一个key非常热点,在不停的扛着大并发,大并发集中对这
一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求
数据库,就像在
一个屏障上凿开了
一个洞。
为了避免缓存穿透其实有很多种
解决方案。下面介绍几种。
2、
解决方案
(1)布隆过滤器
布隆过滤器是一种数据结构,
垃圾网站和正常网站加起来全世界据
统计也有几十亿个。网警要过滤这些
垃圾网站,总不能到
数据库里面
一个一个去比较吧,这就可以使用布隆过滤器。假设我们存储一亿个
垃圾网站地址。
可以先有一亿个二进制比特,然后网警用八个不同的
随机数产生器(F1,F2, …,F8) 产生八个信息指纹(f1, f2, …, f8)。接下来用
一个随机数产生器 G 把这八个信息指纹映射到 1 到1亿中的八个自然数 g1, g2, …,g8。最后把这八个位置的二进制全部设置为一。过程如下:

有一天网警查到了
一个可疑的网站,想判断一下是否是XX网站,首先将可疑网站通过哈希映射到1亿个比特数组上的8个点。如果8个点的其中有
一个点不为1,则可以判断该元素一定不存在集合中。
那这个布隆过滤器是如何
解决re
dis中的缓存穿透呢?很简单首先也是对所有可能
查询的参数以hash形式存储,当
用户想要
查询的时候,使用布隆过滤器发现不在集合中,就直接丢弃,不再对持久层
查询。

这个形式很简单。
2、缓存空对象
当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置
一个过期时间,之后再访问这个数据将会从缓存中
获取,保护了后端数据源;


但是这种
方法会存在两个问题:
如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。
二、缓存雪崩
1、概念
缓存雪崩是指,缓存层出现了
错误,不能正常工作了。于是所有的请求都会达到存储层,存储层的
调用量会暴增,造成存储层也会挂掉的情况。

2、
解决方案
(1)re
dis高可用
这个思想的含义是,既然re
dis有可能挂掉,那我多增设几台re
dis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。
(2)限流降级
这个
解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读
数据库写缓存的线程
数量。比如对某个key只允许
一个线程
查询数据和写缓存,其他线程等待。
(3)数据预热
数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。