当前位置: 首页 > 科技观察

RedisBloomFilter布隆过滤器原理与实现

时间:2023-03-20 17:55:00 科技观察

布隆过滤器概念布隆过滤器(英文:BloomFilter)于1970年由一个名叫布卢姆的年轻人提出。它实际上是一个长二进制向量和一系列随机映射函数。布隆过滤器可用于检索元素是否在集合中。其优点是空间效率和查询时间远超一般算法,缺点是存在一定的误识别率和删除难度。BloomFilter原理Bloomfilter的原理是当一个元素加入到集合中时,通过K个哈希函数将该元素映射到位数组中的K个点,并将它们置为1。在检索时,我们只需要查看这些点是否全为1就可以知道(大概)是否在集合中:如果这些点中有任何一个为0,则被选中的元素一定不存在;如果都为1,则被检查的元素可能在。这就是Bloomfilter的基本思想。BloomFilter与单一哈希函数Bit-Map的区别在于,BloomFilter使用k个哈希函数,每个字符串对应k位。这减少了冲突的可能性。缓存穿透将直接命中每个查询的数据库。简而言之,我们首先将数据库中的所有数据加载到过滤器中。比如现在数据库的id有:1、2、3,那么就以id:1为例。上图经过3次hash,他把原来的0值变成了1,当下一个数据进来查询的时候,如果id的值是1,那我就取1去hash3次,发现hash值of3次和上面3个位置完全一样,证明filter中有1,否则不一样,说明不存在。应用场景在哪里?一般我们会用它来防止缓存崩溃。简单的说,你的数据库的id从1开始,然后自动增加。那我就知道你的接口是通过id来查询的,所以我就用负数来查询。这时候你会发现缓存里面没有这个数据,我去数据库里查了下,但是没有一个请求,100、1000、10000?基本上,您的数据库无法容纳它了。如果将它添加到缓存中,它将不再存在。如果你判断没有这个数据,你就不去查。只返回一个空的数据。这东西这么好有什么缺点吗?对了,下面我们继续看BloomFilter的缺点。BloomFilter之所以能够在时间和空间上取得比较高的效率,是因为它牺牲了判断的准确性和删除的便利性。有误判,可能需要检查的元素不在容器中,但是散列后得到的k个位置全为1。如果布隆过滤器中存储了黑名单,则可以通过创建白名单来存储可能被误判的元素。很难去除。放置在容器中的元素映射到位数组的k个位置中的1。删除的时候不能简单的直接设置为0,这样可能会影响其他元素的判断。可以使用CountingBloomFilter常见问题1.为什么要使用多个哈希函数?Hash本身会面临冲突。如果只使用一个哈希函数,发生冲突的概率会比较高。例如,对于一个长度为100的数组,如果只使用一个hash函数,添加一个元素后,添加第二个元素时碰撞概率为1%,添加第三个元素时碰撞概率为2%元素...但是如果两个Hash函数,添加一个元素后,添加第二个元素时发生碰撞的概率降低到4/10,000(四种可能发生冲突的情况,总的情况数为100x100)Go语言实现?