定义
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
从简单的定义可以看出,使用布隆过滤器目的是为了优化元素查找的性能,不过布隆过滤器提升的是得到 这个元素(key)的存在性的性能。
场景
从解决的问题出发去了解一个工具会更容易理解。
比如我们有一个网站应用,背后用普通的关系型数据库(例如MySQL)做存储,而且做了性能考虑在数据库之前加入了缓存(例如Redis),但是如果有请求高频率在短时间内疯狂访问一个在缓存内不存在,且在数据库也不存在的用户数据,每个请求都会执行缓存的访问和数据库的访问,造成大量无意义的缓存访问压力和数据库访问压力。
这时候如果我们在这些无意义的,甚至是恶意攻击的请求访问我们的缓存或者数据库之前,就做一次快速的存在性校验,让不存在的请求直接返回,就可以很大程度上保护缓存和数据库。
从其他的博客还了解到一些典型的场景,
例如垃圾邮件和垃圾短信的检测,被归入垃圾邮件的发件箱或者垃圾短信的来源号码的数量可能是上亿的,这时候一个遍历扫描,即使是优化的字符串匹配算法的消耗和性能在用户端应该都是不可接受的。
例如爬虫避开爬过的URL。
原理
既然要解决上面的问题,那么我们就需要做存在性检查。
如果给我们20亿条交易数据,而且会不断的增加,在每次访问缓存或者数据库之前做一个存在性检查,最直接想到的可能是类似hashtable这样的数据结构,去存储每个交易的key,每次有新的交易进来,就加入一条新的记录,容量不够就扩容,每次有查询进来,就做一次查找操作,这样的设计在数据越来越大的时候,占用的空间会越来越大,假设我们使用mysql的 varchar(36) 做