加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

内存瓦解了?着实你只必要换一种方法

发布时间:2019-10-30 20:05:50 所属栏目:建站 来源:平头哥
导读:在上一篇 Java 多线程爬虫及漫衍式爬虫架构试探 中,我们行使了 JDK 自带的 Set 荟萃来举办 URL 去重,看上去结果不错,可是这种做法有一个致命了缺陷,就是跟着收罗的 URL 增多,你必要的内存越来越大,最终会导致你的内存瓦解。那我们在不行使数据库的情

  1. <dependency> 
  2.     <groupId>com.google.guava</groupId> 
  3.     <artifactId>guava</artifactId> 
  4.     <version>28.1-jre</version> 
  5. </dependency> 

Guava 中的布隆过滤器实现的很是伟大,关于细节我们就不去探讨了,我们就来看看 Guava 中布隆过滤器的结构函数吧,Guava 中并没有提供结构函数,并且提供了 create 要领来结构布隆过滤器:

  1. public static <T> BloomFilter<T> create( 
  2.     Funnel<? super T> funnel, int expectedInsertions, double fpp) { 
  3.   return create(funnel, (long) expectedInsertions, fpp); 

funnel:你要过滤数据的范例

expectedInsertions:你要存放的数据量

fpp:误判率

你只必要传入这三个参数你就可以行使 Guava 包中的布隆过滤器了,下面这我写的一段 Guava 布隆过滤器测试措施,可以窜改 fpp 多运行屡次,体验 Guava 的布隆过滤器。

  1. public class GuavaBloomFilterTest { 
  2.     // bit 数组巨细 
  3.     private static int size = 10000; 
  4.     // 布隆过滤器 
  5.     private static BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), size, 0.03); 
  6.  
  7.     public static void main(String[] args) { 
  8.         // 先向布隆过滤器中添加 10000 个url 
  9.         for (int i = 0; i < size; i++) { 
  10.             String url = "https://voice.hupu.com/nba/" + i; 
  11.             bloomFilter.put(url); 
  12.         } 
  13.         // 前10000个url不会呈现误判 
  14.         for (int i = 0; i < size; i++) { 
  15.             String url = "https://voice.hupu.com/nba/" + i; 
  16.             if (!bloomFilter.mightContain(url)) { 
  17.                 System.out.println("该 url 被收罗过了"); 
  18.             } 
  19.         } 
  20.         List<String> list = new ArrayList<String>(1000); 
  21.         // 再向布隆过滤器中添加 2000 个 url ,在这2000 此中就会呈现误判了 
  22.         // 误判的个数为 2000 * fpp 
  23.         for (int i = size; i < size + 2000; i++) { 
  24.             String url = "https://voice.hupu.com/nba/" + i; 
  25.             if (bloomFilter.mightContain(url)) { 
  26.                 list.add(url); 
  27.             } 
  28.         } 
  29.         System.out.println("误判数目:" + list.size()); 
  30.     } 

布隆过滤器的应用

缓存击穿

缓存击穿是查询数据库中不存在的数据,假若有效户恶意模仿哀求许多缓存中不存在的数据,因为缓存中都没有,导致这些哀求短时刻内直接落在了DB上,对DB发生压力,导致数据库非常。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读