BloomFilter原理:
定义一个长度为n的数组,里边的元素军定义为0,当一个数据加入到某个集合当中,首先通过K个hash函数映射到数组中的k个点,将映射到的数组上元素改为1,当查询这个数据时,先通过k个hash函数映射的结果,判断如果所有的映射的点的值均为1,则表示集合中有大概率存在这个元素,反之如果有一个映射的点为0,则集合中肯定没有这个元素。
优缺点:
优点:通过k个hash,减少hash碰撞的概率;添加查询效率也很快,均为O(k);布隆过滤器不存储元素,非常适合做数据校验。
缺点:存在一定的误判,还是有一定的碰撞几率会导致误判,并且随着数据量的增大碰撞机率也会增大,所以根据集合元素数量的多少选择是否需要布隆过滤器,以及设计布隆过滤器的hash函数的个数和数组的长度;删除困难,也是因为碰撞的原因。
特性:
一个元素的判定结果为存在则不一定存在,一个元素的判定结果为不存则一定不存在。可以添加元素,不允许删除。
使用BloomFilter解决redis缓存穿透
1.可以自定义布隆过滤器
2.使用Google的guava实现的过滤器,个人推荐 ,谷歌多年的经验总结出来,可以设置数组的长度和误判率,还是比较精准的。
3.使用redis bitmap实现,不过得自己定义hash函数,跟自定义差不多。