布隆过滤器-使用场景的思考

简介

布隆过滤器(Bloom Filter)由布隆于 1970 年提出,它实际上由一个很长的二进制向量和一系列随机映射函数组成。布隆过滤器能够用于查询一个元素是否在一个集合中,它的优势是空间和时间效率都远超通常的算法,缺点是会有必定的误判和删除困难。算法

工做中遇到的问题

es插入时,咱们须要制定id,而制定了id就须要查询,致使读取的压力很大,并且会存在重复插入的场景(id一致,其余也一致,多余的操做)数据库

考虑的几种改造方案:
方案1:插入es前,添加缓存,若存在则不进行多余的es插入
方案2:插入es前,使用boomfilter,理论上空间比方案1更加小数组

然而方案2,存在了漏数据的风险,这是咱们没法接受的,故排除方案2浏览器

网上关于错误率是否能够接受的一些例子:

不少时候这个错误率咱们是能接受的缓存

  • 譬如垃圾邮箱问题,是坏人必定会被抓,这个能保证。无非是一些好人也被抓,这个能够经过给这些可伶的被误伤的设置个白名单就OK。
  • 至于爬虫Url重复这个就更没问题了,会缺掉一些网页而已。
  • 至于在缓存穿透上的应用,是为了不恶意用户频繁请求缓存中不存在DB也不存在的值,会致使缓存失效、DB负载过大,可使用BloomFilter把全部数据放到bit数组中,当用户请求时存在的值确定能放行,部分不存在的值也会被放行,绝大部分会被拦截,这些少许漏网之鱼对于DB的影响就会比大量穿透好的多了。

技术方案中 使用布隆过滤器-的案例:

  • Google 的分布式数据库 Bigtable 使用了布隆过滤器来查找不存在的行或列,以减小磁盘查找的IO次数。
  • Squid 网页代理缓存服务器在 cache digests 中使用了也布隆过滤器。
  • Venti 文档存储系统也采用布隆过滤器来检测先前存储的数据。
  • SPIN 模型检测器也使用布隆过滤器在大规模验证问题时跟踪可达状态空间。
  • Google Chrome浏览器使用了布隆过滤器加速安全浏览服务。
  • Google Guava - 使用bloom过滤器判断是否存在该行(rows)或(colums),以减小对磁盘的访问,提升数据库的访问性能
  • Apache的HBase - 使用bloom过滤器判断是否存在该行(rows)或(colums),以减小对磁盘的访问,提升数据库的访问性能
  • Apache_Cassandra - 使用bloom过滤器判断是否存在该行(rows)或(colums),以减小对磁盘的访问,提升数据库的访问性能
  • 比特币 - 使用布隆过滤判断钱包是否同步OK

主要是针对不存在的,进行短路操做,避免无效的查询安全

相关文章
相关标签/搜索