布隆过滤器及在java中的使用

布隆过滤器主要是为了解决海量数据的存在性问题,对于海量数据中判定某个数据是否存在且容忍轻微误差的场景(比如缓存穿透、海量数据去重)来说,非常适合

什么是布隆过滤器?用于解决什么问题

布隆过滤器时一种概率型的数据结构,用于快速判断一个元素是否属于某个集合,通过使用多个哈希函数和位数组来存储元素的信息。

布隆过滤器用于检索一个元素是否在一个集合中。

  • 优点:空间效率和查询时间都远远超过一半的算法
  • 缺点:有一定的误判率,不支持删除

解决缓存穿透的问题

布隆过滤器的基本原理

  • 初始化:创建一个长度为m的位数组,初始时所有位都置为0
  • 添加元素:将要添加的元素通过多个不同的哈希函数映射到位数组上的位置,并将对应的位设置为1
  • 查询元素:查询一个元素时,同样地使用多个哈希函数映射到位数组上的位置,如果所有对应的位都为1,则说明该元素可能存在于集合中,如果任意一个位为0,则说明该元素不一定存在于集合中。

在Java中的使用

导入redisson依赖包

        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.17.3</version>
        </dependency>

代码示例

@Test
public void test5() {
    Config config = new Config();
    config.useSingleServer().setAddress("redis://172.16.67.37:6379");
    RedissonClient cient = Redisson.create(config);
    RBloomFilter<String> bloomFilter = cient.getBloomFilter("test5-bloom-filter");
    // 初始化布隆过滤器,数组长度100W,误判率 1%
    bloomFilter.tryInit(1000000L, 0.01);
    // 添加数据
    bloomFilter.add("aaa");
    // 判断是否存在
    System.out.println(bloomFilter.contains("bbbb"));
    System.out.println(bloomFilter.contains("aaa"));
}

运行结果:

false   // 肯定不存在
true    // 可能存在,有1%的误判率

注意:误判率设置过小,会产生更多次的 Hash 操作,降低系统的性能。通常我们的建议值是 1%

布隆过滤器的处理流程

  1. 把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求值是否存在于布隆过滤器中,不存在的话直接返回请求参数错误给客户端,存在的话走如下流程。
  2. 加入布隆过滤器之后的缓存处理流程图如下。

美团二面:布隆过滤器有什么用?什么原理?如何使用?

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
布隆过滤器是一种高效的数据结构,用判断一个元素是否存在于一个集合。它通过使用多个哈希函数和位数组来实现。 在Java,可以使用第三方库Guava提供的BloomFilter类来使用布隆过滤器。下面是一个使用样例: ```java import com.google.common.hash.BloomFilter; import com.google.common.hash.Funnels; public class BloomFilterExample { public static void main(String[] args) { // 创建一个布隆过滤器,设置期望插入的元素数量和期望的误判率 BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.unencodedCharsFunnel(), 1000, 0.01); // 向布隆过滤器添加元素 bloomFilter.put("apple"); bloomFilter.put("banana"); bloomFilter.put("orange"); // 判断元素是否存在于布隆过滤器 System.out.println(bloomFilter.mightContain("apple")); // true System.out.println(bloomFilter.mightContain("banana")); // true System.out.println(bloomFilter.mightContain("orange")); // true System.out.println(bloomFilter.mightContain("grape")); // false } } ``` 在上面的样例,首先创建了一个布隆过滤器,设置了期望插入的元素数量为1000,期望的误判率为0.01。然后通过`put`方法向布隆过滤器添加元素。最后使用`mightContain`方法判断元素是否存在于布隆过滤器。 需要注意的是,布隆过滤器是一个概率性数据结构,存在一定的误判率。因此,在判断元素是否存在时,可能会出现误判的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值