【IT老齐008】布隆过滤器
【IT老齐008】布隆过滤器
缓存穿透
绕过缓存服务器进入数据库查询
场景举例:正常redis有1000条缓存数据,忽然遭到爬虫/流量攻击攻击,大量不存在的于redis的数据批量查询,由于redis不存在这些数据,会到数据库进行查询。由于数据库对于瞬时高并发访问的承载能力弱,所以可能对数据库造成影响,甚至崩溃。
缓存穿透攻击:指恶意用户在短时间内大量查询不存在的数据,导致大量请求在被送达数据库进行查询,当请求数量超过数据库负载上限时,使系统响应出现高延迟甚至瘫痪的行为。
布隆过滤器
布隆过滤器:由一个很长的二进制向量和一系列随机映射函数组成,可以用于检索一个元素是否在一个集合中。
实现原理
Hash (散列函数):是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。
由于这种转换,可能存在 不同的输入可能会散列成相同的输出。
Hash算法可以将一个数据转换为一个标志,这个标志,就是视频说的hash,hash后若不存在,就由0变为1。存在,不变。
Hash面临的问题就是冲突。假设 Hash 函数是良好的,如果我们的位阵列长度为 m 个点,那么如果我们想将冲突率降低到例如 1%, 这个散列表就只能容纳 m/100 个元素。显然这就不叫空间有效了(Space-efficient)。
解决方法也简单,就是使用多个 Hash,如果它们有一个说元素不在集合中,那肯定就不在。如果它们都说在,虽然也有一定可能性它们在说谎,不过直觉上判断这种事情的概率是比较低的。
特点
- 一定的误识别率
- 删除困难
使用
布隆过滤器初始化后数据被删除
布隆过滤器某一位二进制可能被多个编号hash引用(看hash的特点:不同的输入可能会散列成相同的输出),不能直接处理删除布隆过滤器的数据。
解决方案:
- 定时异步重建布隆过滤器
- 计数BloomFilter
注意:如果不处理,布隆过滤器的误判率会增高