(1)新建一个maven工程,引入guava包
<dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>22.0</version> </dependency> </dependencies>
(2)测试一个元素是否属于一个百万元素集合所需耗时
import java.util.ArrayList;import java.util.List; import com.google.common.hash.BloomFilter; import com.google.common.hash.Funnels; public class Test { private static int size = 1000000; private static BloomFilter<Integer> bloomFilter =BloomFilter.create(Funnels.integerFunnel(), size); public static void main(String[] args) { for (int i = 0; i < size; i++) { bloomFilter.put(i); } List<Integer> list = new ArrayList<Integer>(1000); //故意取10000个不在过滤器里的值,看看有多少个会被认为在过滤器里 for (int i = size + 10000; i < size + 20000; i++) { if (bloomFilter.mightContain(i)) { list.add(i); } } System.out.println("误判的数量:" + list.size()); } }
(3) 实际使用
String get(String key) { String value = redis.get(key); if (value == null) { if(!bloomfilter.mightContain(key)){ return null; }else{ value = db.get(key); redis.set(key, value); } } return value; }
优点
- 思路简单
- 保证一致性
- 性能强
缺点
- 代码复杂度增大
- 需要另外维护一个集合来存放缓存的Key
- 布隆过滤器不支持删值操作