赞
踩
思考:海量数据下去重,如果是非数值类型的话如何判断?
1970年由布隆提出的一种空间效率很高的概率型数据结构,它可以用于检索一个元素是否在一个集合中。
由只存0或1的位数组和多个hash算法, 进行判断数据 【一定不存在或者可能存在的算法】。
如果这些bit数组 有任何一个0,则被判定的元素一定不在; 如果都是1则被检元素很可能在。
对比bitmap位图,布隆过滤器适合更多类型元素,通过hash值转换。
原理
将元素添加到一个bitmap数组中,每个散列函数将元素映射到bitmap数组中的一个位置
如果该位置已经被占用,则将该位置置为1,否则置为0
当要查询一个元素是否存在时,只需要计算该元素的散列值,并检查bitmap数组中对应的位置是否已经被置为1
如果都是1,则该元素可能存在,否则肯定不存在。
优点
缺点
案例测试地址:https://www.jasondavies.com/bloomfilter/
记住结论:不存在的一定不存在,存在的不一定存在
注意点
布隆过滤器存在误判率,数组越小,所占的空间越小,误判率越高;如果要降低误判率,则数组越长,但所占空间越大
最大限度的避免误差, 选取的位数组应尽量大, hash函数的个数尽量多, 但空间占用的浪费和性能的下降
业务选择的时候, 需要误判率与bit数组长度和hash函数数量的平衡
布隆过滤器不能直接删除元素,因为所属的bit可能多个元素有使用
如果要删除则需要重新生成布隆过滤器,或者把布隆过滤器改造成带引用计数的方式
如何解决布隆过滤器不支持删除的问题
(1)海量数据下垃圾邮件解决方案(垃圾短信、黑名单同理)
(2)解决缓存穿透解决方案
(3)爬虫URL去重和分库分表注册手机号唯一性解决方案
大量的网页爬取,通过解析已经爬取页面中的网页链接,然后再爬取这些链接对应的网页
同一个网页链接有可能被包含在多个页面中,会导致爬虫在爬取的过程中,重复爬取相同的网页
(4)海量数据下-分库分表下手机号重复注册解决方案
创建布隆过滤器,根据业务数据量设置位数组的大小,将位数组全部设置为0;
把要注册的手机号通过通过哈希算法处理,获得相应的哈希值;
根据哈希值计算出位数组中的位置,如果对应的位数组中的位置有存在0,则一定是未注册的
如果经过多个hash函数处理,对应的位数组中都是1,则认为是注册过的
最后如果用户注册成功后,将位数组中的位置设置为1
根据哈希值计算出位数组中的位置,如果对应的位数组中的位置有存在0,则一定是未注册的
如果经过多个hash函数处理,对应的位数组中都是1,则认为是注册过的
最后如果用户注册成功后,将位数组中的位置设置为1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。