首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

知乎爬蟲實戰(五):多線程 + 隊列緩存 + LRU 淘汰,全方位效能優化

     編輯:Java 綜合教學

知乎爬蟲實戰(五):多線程 + 隊列緩存 + LRU 淘汰,全方位效能優化

GitHub 專案:https://github.com/MatrixSeven/ZhihuSpider

優化一:多線程加速(生產者-消費者模型)

  • 兩個線程池:ParserFollowerPool 抓取關注/粉絲列表,ParserUserInfoPool 解析用戶詳情。
  • 基類 ParserBase 實現 Runnable,子類覆寫 run() 封裝原邏輯。
  • 共享資源(去重 Set、入隊列)需 synchronized 或 ConcurrentHashMap 保證線程安全。

優化二:本地隊列緩存減少 DB 訪問

痛點:多線程高併發下,頻繁查庫判重導致連接池耗盡、CPU 飆升。

方案:啟動時將現有 url_token 全量載入 List<String> tokenCache,判重先查緩存,命中率 > 95% 時大幅降低 DB 壓力。

優化三:手寫 LRU 淘汰策略提升命中率

緩存無限增長會 OOM,需淘汰冷數據。實現 Least Recently Used (LRU):

  • 雙向鏈表 + HashMap:get(key) 移至頭部,put(key,val) 滿容量時刪尾部。
  • 進階:結合訪問頻次 + 最近訪問時間雙因子評分淘汰,適配長尾熱點數據。

核心代碼見專案 LRUCache.java。

效果對比

指標優化前優化後
單機 QPS~15~120
DB 連接峰值80+<10
內存佔用無控制固定 50MB (LRU 上限)

附錄:頁面解析回顧(同第 4 篇)

移動端 UA 模擬、Jsoup 選擇器提取、API 分頁邏輯不變,詳見上篇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved