美丽心灵公益论坛

查看: 2474|回复: 10

布隆过滤器:

[复制链接]
累计签到:534 天
连续签到:1 天

887

主题

3119

回帖

4万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
48414
legs+ 发表于 2023-10-18 14:41:26| 字数 127 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
布隆过滤器使用场景
  • 原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中?
  • 接触过爬虫的,应该有这么一个需求,需要爬虫的网站千千万万,对于一个新的网站url,我们如何判断这个url我们是否已经爬过了?
  • 垃圾邮箱的过滤。

累计签到:19 天
连续签到:2 天

27

主题

371

回帖

2135

积分

金牌会员

Rank: 6Rank: 6

积分
2135
孤星3 发表于 2023-10-18 16:13:42| 字数 67 | 显示全部楼层
原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中?


用Hash来区分吗?

很有趣的应用场景。
累计签到:19 天
连续签到:2 天

27

主题

371

回帖

2135

积分

金牌会员

Rank: 6Rank: 6

积分
2135
孤星3 发表于 2023-10-18 17:54:27| 字数 74 | 显示全部楼层
孤星3 发表于 2023-10-18 16:13
用Hash来区分吗?

很有趣的应用场景。

不过如果只是纯号码,可以按照排序来搜寻,不必像字符串那样对比的复杂。
累计签到:534 天
连续签到:1 天

887

主题

3119

回帖

4万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
48414
 楼主| legs+ 发表于 2023-10-18 18:49:05| 字数 85 | 显示全部楼层
孤星3 发表于 2023-10-18 17:54
不过如果只是纯号码,可以按照排序来搜寻,不必像字符串那样对比的复杂。 ...

不是说了,布隆过滤器
其实,是一种模块,说白了就是一个库
累计签到:534 天
连续签到:1 天

887

主题

3119

回帖

4万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
48414
 楼主| legs+ 发表于 2023-10-18 18:50:37| 字数 48 | 显示全部楼层
hashmap也是一种方法,key与value分离
但是,它只适合小范围的过滤
大数据还得布隆过滤器
累计签到:534 天
连续签到:1 天

887

主题

3119

回帖

4万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
48414
 楼主| legs+ 发表于 2023-10-18 18:51:31| 字数 508 | 显示全部楼层
HashMap是Java中常用的集合类之一,它实现了Map接口并继承自AbstractMap类。HashMap使用哈希表来存储键值对,通过将键映射为哈希码来进行高效的插入、查找和删除操作。

以下是HashMap的常见用法和特点:

键值对:HashMap允许存储任意类型的键和值。可以通过键来查找对应的值,从而实现高效的数据查询操作。

哈希表:HashMap内部使用哈希表来组织数据。对于每个键,HashMap会先将其哈希为一个整数值,然后根据该值来快速查找对应的值。对于哈希冲突的情况,HashMap使用链表或红黑树来解决。

空键和空值:HashMap允许使用null作为键和值。当存储null时,哈希表会特殊处理以确保正确的存储和检索。

线程不安全:HashMap不是线程安全的,如果多个线程同时修改HashMap,可能会导致不一致的结果。如果需要在多线程环境下使用HashMap,可以考虑使用ConcurrentHashMap。

遍历:可以使用迭代器或者Java 8引入的Stream API来遍历HashMap的键值对。常见的遍历方式包括使用Iterator迭代器遍历或者使用forEach方法结合Lambda表达式进行遍历。
累计签到:534 天
连续签到:1 天

887

主题

3119

回帖

4万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
48414
 楼主| legs+ 发表于 2023-10-18 18:52:47| 字数 40 | 显示全部楼层
如果搞懂了hashmap,Java编程也就搞懂了一半
因为,hashmap太强大了
累计签到:19 天
连续签到:2 天

27

主题

371

回帖

2135

积分

金牌会员

Rank: 6Rank: 6

积分
2135
孤星3 发表于 2023-10-18 19:05:48| 字数 135 | 显示全部楼层
legs+ 发表于 2023-10-18 18:49
不是说了,布隆过滤器
其实,是一种模块,说白了就是一个库

哦哦,漏了这点。

布隆过滤器比线性搜索和二进制搜索更优越了,以前我掌握最好的只不过是二进制搜索。

从Linear Search和Binary Search翻译过来,不知道对不对?
累计签到:534 天
连续签到:1 天

887

主题

3119

回帖

4万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
48414
 楼主| legs+ 发表于 2023-10-18 19:09:20| 字数 45 | 显示全部楼层
嗯,
它实际上是一个很长的二进制向量和一系列随机映射函数。

注意函数,编程语法最简单的就是函数
累计签到:534 天
连续签到:1 天

887

主题

3119

回帖

4万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
48414
 楼主| legs+ 发表于 2023-10-18 20:07:59| 字数 315 | 显示全部楼层
这里我举一个布隆过滤器的例子:
缓存穿透

缓存穿透是指查询一个根本不存在的数据,这样就会导致请求不会命中缓存而是去查询数据库,导致后端存储压力增大,缓存失去了保护后端存储的功能。

导致缓存穿透的原因有两个,一个是自身代码和数据有问题。还有可能就是恶意攻击者导致大量空命中。

解决缓存穿透的方法有两种:

1、缓存空对象

将空对象缓存到Redis中。这样再次收到同样查询不存在的数据时就可以保护后端存储了。

但是这种方法会占用大量的内存(键),可以对这些键设置过期时间。

2、布隆过滤器

在缓存层之前加上布隆过滤器作为第一层进行过滤。布隆过滤器可以判断出该数据是否一定不存在。

如果布隆过滤器认为该数据一定不存在,那么直接返回,不需要访问缓存和后端存储。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|免责及版权声明|关于|美丽心灵公益论坛

GMT+8, 2025-8-11 08:07 , Processed in 0.361545 second(s), 26 queries .

Powered by Discuz! X3.4

!copyright!

快速回复 返回顶部 返回列表