布隆过滤器是指,用于判断集合中是否存在某一个元素的快速定位思想
适用于判断某个数据是否在集合中存在,不一定百分百准备, Bloom Filter基本实现原理采用位数组与联合函数一起实现
其内部维护了一个二进制数组,计算key的三个hash值,当三个值对应下标位置处的状态都为1,表明此key存在于集合中。
故而,当数组长度短时,其误判的几率特别大
maven依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>22.0</version>
</dependency>
Java案例
public class BlongTest {
/**
* 在布隆中存放100万条数据
*/
private static Integer size = 1000000;
public static void main(String[] args) {
// 0.01表明误判的几率
BloomFilter<Integer> integerBloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, 0.01);
for (int i = 0; i < size; i++) {
integerBloomFilter.put(i);
}
// 从布隆中查询数据是否存在
ArrayList<Integer> strings = new ArrayList<>();
for (int j = size; j < size + 10000; j++) {
if (integerBloomFilter.mightContain(j)) {
strings.add(j);
}
}
System.out.println("误判数量:" + strings.size());
}
}
基于布隆过滤器解决Redis击穿问题
我们可以在程序启动后,先将数据库中的key放入布隆过滤器中,缓存至jvm内存。
然后在使用key访问Redis前,先进行布隆过滤,不存在布隆过滤器中,则判断为恶意攻击
欢迎大家和帝都的雁积极互动,头脑交流会比个人埋头苦学更有效!共勉!
公众号:帝都的雁