Bloom Filter作用:是一种概率型的数据结构,可以判断may be contains some value,但是肯定不包含某个value
比如问题:https://blog.csdn.net/zdxiq000/article/details/57626464
或者比如redis 缓存击穿,比如我们database中含有1千万条数据,database前加一层缓存,如果没有加上布隆过滤器,那么如果未命中缓存,则直接击穿到database。攻击者可以利用这一点疯狂的访问databse,直至瘫痪。
解决方案:将database中的一千万条数据跑一遍布隆过滤器。这样,如果一个请求过来后,判断是否在布隆过滤器内,如果在(may be),则按正常的逻辑走,访问database。如果不再,则不再访问database,直接返回即可,这样就减少了对database的无效访问。
package com.demo; import com.google.common.hash.Funnels; import java.util.HashSet; import java.util.Random; import com.google.common.hash.BloomFilter; public class TestBloomFilter { static int sizeOfNumberSet = 1000; static Random generator = new Random(); public static void main(String[] args) { int error = 0; HashSet<Integer> hashSet = new HashSet<>(); BloomFilter<Integer> filter = BloomFilter.create(Funnels.integerFunnel(), sizeOfNumberSet); for(int i = 0; i < sizeOfNumberSet; i++) { int number = generator.nextInt(); if(filter.mightContain(number) != hashSet.contains(number)) { error++; } filter.put(number); hashSet.add(number); } System.out.println("Error count: " + error + ", error rate = " + String.format("%f", (float)error/(float)sizeOfNumberSet)); } }