Redis缓存穿透问题及解决方案

Redis缓存穿透问题及解决方案


视频地址:https://www.bilibili.com/video/av753586082/

场景:查询信息的时候,缓存并未找到对应信息,则查数据库为空,且不会加入缓存,这就会导致,下次在查询同样信息,由于缓存未命中,则仍旧会查底层数据库,所以缓存就一直未起到应有的作用,当并发流量大时,会很容易把DB打垮。

缓存击穿示意
在这里插入图片描述
一般查询的时候:

1.缓存层不命中。
2.存储层不命中,不将空结果写回缓存。
3.返回空结果。

缓存穿透问题可能会使后端存储负载加大,由于很多后端存储不具备高并发性,甚至可能造成后端存储宕掉。

方案1:缓存空对象
会出现的问题:
空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间(如果是攻击,问题更严重),比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。防止缓存库过大。

在海量数据中如何确定数据存在或者不存在,缓存空对象占用空间还是比较大,因此会有考虑缓存hash,md5等方式以减少空间。但是这种情况会存在hash碰撞的情况。为了减少hash碰撞可以使用
1.多次Hash进行减少碰撞几率,
2.扩大位图长度以期获取更大的空间,也就相当于减少碰撞的几率。
在这里插入图片描述
继续优化:
如何在海量数据里面确定数据是否存在?
使用布隆过滤器。
原理:当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。
本质:位数组(二进制向量)+ 一系列随机映射函数
在这里插入图片描述
特性:可以100%确定数据不存在,不能一定确定数据存在,存在一定的误判
在线演示地址
https://www.jasondavies.com/bloomfilter/

应用:
Hbase查询的时候也可以利用布隆过滤器进行查询数据是否存在这个hfile
最初用于网络爬虫确定网页url是否已经抓取。

bloomFilter位置
在这里插入图片描述
但是布隆过滤器存在问题
1.hash映射会产生碰撞(导致会有一定的误判)
2.原生的布隆过滤器不支持删除操作(可以选择带计数的布隆过滤器,移除的时候count–)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值