- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- <version>28.1-jre</version>
- </dependency>
Guava 中的布隆过滤器实现的非常复杂,关于细节我们就不去探究了,我们就来看看 Guava 中布隆过滤器的构造函数吧,Guava 中并没有提供构造函数,而且提供了 create 方法来构造布隆过滤器:
- public static <T> BloomFilter<T> create(
- Funnel<? super T> funnel, int expectedInsertions, double fpp) {
- return create(funnel, (long) expectedInsertions, fpp);
- }
funnel:你要过滤数据的类型
expectedInsertions:你要存放的数据量
fpp:误判率
你只需要传入这三个参数你就可以使用 Guava 包中的布隆过滤器了,下面这我写的一段 Guava 布隆过滤器测试程序,可以改动 fpp 多运行几次,体验 Guava 的布隆过滤器。
- public class GuavaBloomFilterTest {
- // bit 数组大小
- private static int size = 10000;
- // 布隆过滤器
- private static BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), size, 0.03);
-
- public static void main(String[] args) {
- // 先向布隆过滤器中添加 10000 个url
- for (int i = 0; i < size; i++) {
- String url = "https://voice.hupu.com/nba/" + i;
- bloomFilter.put(url);
- }
- // 前10000个url不会出现误判
- for (int i = 0; i < size; i++) {
- String url = "https://voice.hupu.com/nba/" + i;
- if (!bloomFilter.mightContain(url)) {
- System.out.println("该 url 被采集过了");
- }
- }
- List<String> list = new ArrayList<String>(1000);
- // 再向布隆过滤器中添加 2000 个 url ,在这2000 个中就会出现误判了
- // 误判的个数为 2000 * fpp
- for (int i = size; i < size + 2000; i++) {
- String url = "https://voice.hupu.com/nba/" + i;
- if (bloomFilter.mightContain(url)) {
- list.add(url);
- }
- }
- System.out.println("误判数量:" + list.size());
- }
- }
布隆过滤器的应用
缓存击穿
缓存击穿是查询数据库中不存在的数据,如果有用户恶意模拟请求很多缓存中不存在的数据,由于缓存中都没有,导致这些请求短时间内直接落在了DB上,对DB产生压力,导致数据库异常。 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|