GitHub 專案:https://github.com/MatrixSeven/ZhihuSpider
ParserBase 實現 Runnable,子類覆寫 run() 封裝原邏輯。synchronized 或 ConcurrentHashMap 保證線程安全。痛點:多線程高併發下,頻繁查庫判重導致連接池耗盡、CPU 飆升。
方案:啟動時將現有 url_token 全量載入 List<String> tokenCache,判重先查緩存,命中率 > 95% 時大幅降低 DB 壓力。
緩存無限增長會 OOM,需淘汰冷數據。實現 Least Recently Used (LRU):
get(key) 移至頭部,put(key,val) 滿容量時刪尾部。核心代碼見專案 LRUCache.java。
| 指標 | 優化前 | 優化後 |
|---|---|---|
| 單機 QPS | ~15 | ~120 |
| DB 連接峰值 | 80+ | <10 |
| 內存佔用 | 無控制 | 固定 50MB (LRU 上限) |
移動端 UA 模擬、Jsoup 選擇器提取、API 分頁邏輯不變,詳見上篇。