[面试题]缓存穿透,缓存击穿和缓存雪崩,以及布隆过滤器

缓存穿透:
当某一时刻大量请求数据库中不存在的数据时,由于按常规缓存逻辑,不存在的数据不会存入缓存,因此这些请求会直接落到数据库,给数据库造成巨大压力,通常是非正常用户对服务器的攻击行为
应对策略:
1,对不存在的数据设置约定值,如果数据库数据不存在,依然设置缓存,并对其设置一个过期时间,防止redis服务因过多的"不存在"键值压力过大
2,用户端/服务端做好校验,对非常规查询进行拦截
3,使用布隆过滤器:将所有缓存放在布隆过滤器中,迅速识别出无效查询.

缓存击穿:
大量请求同时查询缓存中不存在的值,通常是[某一]缓存过期,刚好大量请求同事查询这个数据,会造成瞬间数据库高并发
应对策略:
1,不设置过期时间,仅作更新
2,对数据库的访问做互斥锁,缓存没数据时,仅允许获取到锁的线程请求数据库

缓存雪崩:
如果大量[不同]缓存在同一时间失效,将会造成在某一时刻可能大量请求直接到数据库,对数据库造成巨大压力
应对策略:
1,缓存时不使用固定过期时间,比如添加随机值
2,不设置过期时间,仅做更新

对比:
假设缓存是多模块护盾,护盾各个模块存在暂时失效的可能,数据库是保护对象;
缓存穿透就是专门攻击护甲的死角位置(恶意行为);
缓存击穿就是对某个位置持续攻击,如果某个瞬间该位置护盾刚好[失效],就会造成保护对象受到伤害;
缓存雪崩就是某一时间多个护盾模块同时失效,保护对象就会大面积暴露在危险之下

布隆过滤器(Bloom Filter): 由Burton Howard Bloom在1970年提出,是一种空间效率高的概率型数据结构,它专门用来检测集合中是否存在特定的元素
布隆过滤器原理

使用k个哈希函数和一个长度为m的byte数组(数组中每个位置初始为0),散列存储key.
每次存值将key通过k个哈希函数计算得到k个索引,通过索引将数组对应位置设为1;查询时同样将key"拆"成k个hash值,然后判断对应角标:如果有1个为0,说明key一定不存在;如果都为1,说明key有可能存在,也有可能不存在,这个概率即阳性率,它会随着byte数组长度的增大而增大,也会随着key的增多而减小;

优点:
由于存储的是byte数组,因此节省空间且效率很高;
使用hash计算key具有保密性;
可以在硬件层面使用指令执行hash
缺点:
由于存在假阳性,不适用于要求100%准确率的场景;
只能插入和查询,如果有更新或删除,阳性率将失去意义;

参考1
参考2
参考3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值