「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
位图
- 在很多中间件中也有应用到位图
- 其不是一个新颖的数据结构,只是内部是
bool
类型实现的 - 主要针对的标记📌是存储大量数据的时候,比如记录上线下线可以使用
1和2
代表 - 当随着时间的累计数据量会不断增大,那么我们使用位去表示就可以
bit
- 其不是一个新颖的数据结构,只是内部是
布隆过滤器
- 对于位图的应用,布隆过滤器可谓是淋漓尽致
-
布隆过滤器应用的场景很广,其原理是判断某值如果不存在那就一定不存在,如果存在是有可能存在的
-
在布隆过滤器内部是使用多个
hash()
函数用来映射到位数组中 -
与
HashMap
原理一样,每次putKey
的时候会调用多个hash
函数,来算一个索引值index
最后取模到一个位数组的位置 -
当想查看布隆过滤器中是否存在这个
key
时候,对调用多个hash
函数,如果映射到的位置都是1
那么可能存在这个key
-
如果有一个映射到的位置中的位数组是
0
那么布隆过滤器中肯定不存在这个key
-
应用
- 当我们做统计的时候,如果数据量特别大
- 用其他类型显然是很消耗内存的,所以我们可以使用位图去存
- 比如我们经常去做防止用户爬虫,将
ip
会存白名单和黑名单,我们可以黑名单存在位图中 - 布隆过滤器只存储黑名单
ip
- 进行反向使用布隆过滤器的思想,如果每次判断的
ip
是黑还是白的时候,如果此ip
不在布隆过滤器中那么一定是白名单 - 因为布隆过滤器可以肯定的是映射到为
0
的一定不存在,所以类似的场景都可以使用布隆过滤器