reids之缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于数据不存在,当先去缓存找数据时,发现不存在,就去数据库中找数据,发现数据库中也没有数据,就返回数据不存在,但没有写入缓存。这样,下次在来访问时缓存中还是没有,又到数据库中查询。例如,查询id等于-1的数据。当有人恶意攻击时,就会造成大量请求到数据库中查询,而缓存就时区了意义。流量大时,可能会导致数据库压力过大。
常见解决方案:
1.把查出来不存在的也存在缓存中,例如id等于-1,就把key=-1,value=null,放到缓存中。这样下次再拿-1查询的时候,就直接从缓存中拿,不会到数据库中查询。这些数据也不能一直存在于缓存中,所以可以设置过期时间。
2.使用布隆过滤器,他可以过滤出一定不存在的数据。
他是一个有一定长度的数组,数据都为0
在这里插入图片描述
假如要添加一个hello,会通过某种计算,比如hash1,得出1、hash2,得出3、hash3,得出8,数组下标为1、3、8的数据为0,说明数据不存在,返回并将对应的数组改为1。
假如要添加一个word,会通过某种计算,比如hash1,得出1、hash2,得出4、hash3,得出9,数组下标为4、9的数据为0,说明数据不存在,返回并将4、9的数组改为1。
假如要添加一个java,会通过某种计算,比如hash1,得出3、hash2,得出6、hash3,得出9,数组下标为6的数据为0,说明数据不存在,返回并将6的数组改为1。
假如要添加一个html,会通过某种计算,比如hash1,得出4、hash2,得出6、hash3,得出9,下标为4、6、9的数据都已经改为1了,说明这个数据可能存在,可是明明不存在,这就是布隆过滤器的误判,当数组越大时,我们误判的情况就越小。
在这里插入图片描述
通过上面我们可以看出,只要数据映射到的数组中一位是0的,那么就表明数据就一定不存在,因为没有任何一个数据去修改过数据为0的下标。
我们将所有数据库中的数据对应的key放到布隆过滤器中,然后当请求过来时,我们就先去缓存中查询,没有查到的话,就去布隆过滤器中判断是否存在,布隆过滤器能判断出一个数据一定不存在,所以当判断出不存在时,可直接返回,不必去数据库中查询数据。减轻出具库压力。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值