2024大厂面试题,布隆(Bloom Filter)过滤器,终获offer

本文介绍了布隆过滤器在面试及Java开发中的使用,包括Redis集成,通过实例展示了bf.add、bf.madd、bf.exists和bf.mexists等操作。在Java中使用Guava实现布隆过滤器,测试结果表明,根据预计插入的数据和误判率,调整位数组大小和hash函数数量。同时讨论了Redis中如何利用布隆过滤器解决缓存穿透问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

127.0.0.1:6379> bf.add name liziba

(integer) 1

image.png

5.2 bf.madd

bf.madd表示添加多个元素

127.0.0.1:6379> bf.madd name liziqi lizijiu lizishi

1) (integer) 1

2) (integer) 1

3) (integer) 1

image.png

5.3 bf.exists

bf.exists表示判断元素是否存在,存在则返回1,不存在返回0

127.0.0.1:6379> bf.mexists name liziba

1) (integer) 1

image.png

5.3 bf.mexists

bf.mexists表示判断多个元素是否存在,存在的返回1,不存在的返回0

127.0.0.1:6379> bf.mexists name liziqi lizijiu liziliu

1) (integer) 1

2) (integer) 1

3) (integer) 0

image.png

6、Java本地内存使用布隆过滤器


使用布隆过滤器的方式有很多,还有很多大佬自己手写的,我这里使用的是谷歌guava包中实现的布隆过滤器,这种方式的布隆过滤器是在本地内存中实现。

6.1 引入pom依赖

com.google.guava

guava

29.0-jre

6.2 编写测试代码

package com.lizba.bf;

import com.google.common.hash.BloomFilter;

import com.google.common.hash.Funnels;

/**

*        布隆过滤器测试代码

* @Author: Liziba

* @Date: 2021/8/29 14:51

*/

public class BloomFilterTest {

/** 预计插入的数据 */

private static Integer expectedInsertions = 10000000;

/** 误判率 */

private static Double fpp = 0.01;

/** 布隆过滤器 */

private static BloomFilter bloomFilter = BloomFilter.create(Funnels.integerFunnel(), expectedInsertions, fpp);

public static void main(String[] args) {

// 插入 1千万数据

for (int i = 0; i < expectedInsertions; i++) {

bloomFilter.put(i);

}

// 用1千万数据测试误判率

int count = 0;

for (int i = expectedInsertions; i < expectedInsertions *2; i++) {

if (bloomFilter.mightContain(i)) {

count++;

}

}

System.out.println(“一共误判了:” + count);

}

}

6.3 测试结果

误判了100075次,大概是expectedInsertions(1千万)的0.01,这与我们设置的 fpp = 0.01非常接近。

image.png

6.4 参数说明

在guava包中的BloomFilter源码中,构造一个BloomFilter对象有四个参数:

  • **Funnel funnel:**数据类型,由Funnels类指定即可

  • **long expectedInsertions:**预期插入的值的数量

  • **fpp:**错误率

  • **BloomFilter.Strategy:**hash算法

6.5 fpp&expectedInsertions

  • 当expectedInsertions=10000000&&fpp=0.01时,位数组的大小numBits=95850583,hash函数的个数numHashFunctions=7

image.png

  • 当expectedInsertions=10000000&&fpp=0.03时,位数组的大小numBits=72984408,hash函数的个数numHashFunctions=5

image.png

  • 当expectedInsertions=100000&&fpp=0.03时,位数组的大小numBits=729844,hash函数的个数numHashFunctions=5

image.png

综上三次测试可以得出如下结论:

  • 当预计插入的值的数量不变时,偏差值fpp越小,位数组越大,hash函数的个数越多

  • 当偏差值不变时,预计插入的中的数量越大,位数组越大,hash函数并没有变化(注意这个结论只是在guava实现的布隆过滤器中的算法符合,并不是说所有的算法都是这个结论,我做了多次测试,确实numHashFunctions在fpp相同时,是不变的!)

7、Java集成Redis使用布隆过滤器


Redis经常会被问道缓存击穿问题,比较优秀的解决办法是使用布隆过滤器,也有使用空对象解决的,但是最好的办法肯定是布隆过滤器,我们可以通过布隆过滤器来判断元素是否存在,避免缓存和数据库都不存在的数据进行查询访问!在如下的代码中只要通过bloomFilter.contains(xxx)即可,我这里演示的还是误判率!

7.1 引入pom依赖

org.redisson

redisson-spring-boot-starter

3.16.0

7.2 编写测试代码

package com.lizba.bf;

import org.redisson.Redisson;

import org.redisson.api.RBloomFilter;

import org.redisson.api.RedissonClient;

import org.redisson.config.Config;

/**

*      Java集成Redis使用布隆过滤器防止缓存穿透方案

* @Author: Liziba

* @Date: 2021/8/29 16:13

*/

public class RedisBloomFilterTest {

/** 预计插入的数据 */

private static Integer expectedInsertions = 10000;

/** 误判率 */

private static Double fpp = 0.01;

public static void main(String[] args) {

// Redis连接配置,无密码

Config config = new Config();

config.useSingleServer().setAddress(“redis://192.168.211.108:6379”);

// config.useSingleServer().setPassword(“123456”);

// 初始化布隆过滤器

RedissonClient client = Redisson.create(config);

RBloomFilter bloomFilter = client.getBloomFilter(“user”);

bloomFilter.tryInit(expectedInsertions, fpp);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

结语

看到这篇文章的人不知道有多少是和我一样的Android程序员。

35岁,这是我们这个行业普遍的失业高发阶段,这种情况下如果还不提升自己的技能,进阶发展,我想,很可能就是本行业的职业生涯的终点了。

我们要有危机意识,切莫等到一切都成定局时才开始追悔莫及。只要有规划的,有系统地学习,进阶提升自己并不难,给自己多充一点电,你才能走的更远。

千里之行始于足下。这是上小学时,那种一元钱一个的日记本上每一页下面都印刷有的一句话,当时只觉得这句话很短,后来渐渐长大才慢慢明白这句话的真正的含义。

有了学习的想法就赶快行动起来吧,不要被其他的事情牵绊住了前行的脚步。不要等到裁员时才开始担忧,不要等到面试前一晚才开始紧张,不要等到35岁甚至更晚才开始想起来要学习要进阶。

给大家一份系统的Android学习进阶资料,希望这份资料可以给大家提供帮助。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

图片转存中…(img-bAlRJqRe-1712381908920)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值