BloomFilter简介

本文深入解析了BloomFilter数据结构的原理与应用,包括位数组和hash函数的使用,以及在海量数据去重和处理缓存穿透场景中的优势。通过Guava的BloomFilter包示例,展示了其创建、插入和查询操作,揭示了容错率和容量设定的重要性。

一.简介

BloomFilter底层是一个位图(位数组)的数据结构,通过k个hash函数将这个元素映射到位数组的k个点,将他们设置为1。检索时,我们查看这k个点是否都为1就能够判断元素是否在BloomFilter中(会有一定的误差率);如果k个点有一个点不为1,那么这个元素肯定不在BloomFilter里面。大致的数据结构:
在这里插入图片描述

二.使用场景

1.海量数据的去重
2.处理缓存穿透的场景,用于校验请求的key是否存在

三.使用demo

guava的BloomFilter包

package com.vip.learn.guava;

import com.google.common.hash.BloomFilter;

import java.nio.charset.Charset;

/**
 * Created by andrew.huang on 2019/6/3
 */
public class BloomFilterMain {

	public static void main(String[] args) {
		BloomFilter<String> bloomFilter = BloomFilter.create((from, into) -> {
				into.putString(from, Charset.defaultCharset());
		}, 32 * 1024 * 1024L, 0.01d);

		for(int i = 0;i < 10;i++){
			bloomFilter.put(Thread.currentThread().getName() + i);
		}

		System.out.println(bloomFilter.mightContain("1"));
		System.out.println(bloomFilter.mightContain(Thread.currentThread().getName() + "1"));
	}
}

输出结果:
在这里插入图片描述

四.guava bloomFilter原理

1.BloomFilter.create()
(1)先看看官方api文档对create四个方法的解释
在这里插入图片描述
主要的三个参数:
*funnel:你要怎么插数据到bloomFilter
*expectedInsertions:期待bloomfilter里面包含的元素个数
*fpp(false positive probability):错误容忍率

(2)探索下底层bloomfilter根据这几个参数是怎么处理的
在这里插入图片描述
可以看到BloomFilter这里使用了一个BloomFilterStrategies.MURMUR128_MITZ_64的策略类
在这里插入图片描述
里面的获取numBits和numHashFunctions都是依据数学理论计算出来,有兴趣可以了解https://blog.youkuaiyun.com/v_JULY_v/article/details/6685894

2.BloomFilter.put()方法
在这里插入图片描述
可以看到BloomFilter实际上是通过strategy类去实现,真正的put方法是
在这里插入图片描述
点进去可以看到,这个类主要是通过一个murmur3_128的hash函数去获取hash,根据hash函数的个数,去执行k次hash算法将值put进去

3.BloomFilter.mightContains()方法
在这里插入图片描述
可以看到通过k个hash算法,只要有一个BitArray.get()得到的返回值不为true(也就是在那个元素位置上不为1),那么就会返回false

4.guava BloomFilter的缺点
不能删除元素,必须在预估好容量之后再去设置BloomFilter

五.总结

BloomFilter的实现关键在于位数组容量的大小,容错率的数值和hash函数的选择,在可以容忍一定概率的错误率情况下,能够高效的处理海量数据的去重和判重。

from:andrew.huang

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值