布隆过滤器(Bloom Filter)
布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定不在。
优点
占用空间更少并且效率更高(位数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1,100w 个元素约122kb )
缺点
1.其返回的结果不是精确的,理论情况下添加到集合中的元素越多,误报的可能性就越大。
2.并且存放在布隆过滤器的数据不容易删除。
增强
bitmap更换成数组,当数组某位置被映射一次时就+1,当删除时就-1,这样就避免了普通布隆过滤器删除数据后需要重新计算其余数据包Hash的问题,但是依旧没法避免误判。
布隆过滤器使用场景
- 海量数据处理,判断一个数字是否存在于包含大量数字的数字集中(数字集很大,5 亿以上!)
- 防止缓存穿透(判断请求的数据是否有效避免直接绕过缓存请求数据库)
- 邮箱的垃圾邮件过滤
- 黑名单功能
- 去重(比如爬给定网址的时候对已经爬取过的 URL 去重)
- 【Redis 中的布隆过滤器、Google 开源的 Guava 中自带的布隆过滤器】
布谷过滤器(Cuckoo Filter)
因为布隆顾虑器无法删除,导致后续精确性不断的降低,为了解决布隆过滤器不能删除元素的问题,布谷鸟过滤器横空出世。
布谷鸟过滤器和布谷鸟哈希结构一样,它也是一维数组,但是不同于布谷鸟哈希的是,布谷鸟哈希会存储整个元素,而布谷鸟过滤器中只会存储元素的指纹信息(几个bit,类似于布隆过滤器)。这里过滤器牺牲了数据的精确性换取了空间效率。正是因为存储的是元素的指纹信息,所以会存在误判率,这点和布隆过滤器如出一辙。