2012-12-17 49 views
3

我有一個使用GET請求的API提供圖像的servlet。該servlet基於GET請求的參數創建CAD命令的數據文件。這個數據文件然後被傳送到一個圖像解析器,它在文件系統上創建一個圖像。該servlet讀取圖像並返回響應中的字節。使用Java進行動態圖像緩存

所有的IO和圖像解析器程序的調用可能是非常重要的,大約80kb的圖像在本地系統上以3-4000ms渲染。

大約有20個參數組成GET請求。每個都與圖像的不同部分相關。所以,可能的圖像組合非常大。

爲了減輕加載時間,我計劃將呈現圖像的BLOB存儲在數據庫中。如果GET請求與先前執行的請求匹配,我將從緩存中取出。否則,我會渲染一個新的。這不能解決「第一次」運行,但會幫助「n + 1運行」。

有關我如何提高性能的其他想法?

+1

如何使用wget並通過腳本獲取預加載的圖像,然後在第一次請求進入時使用這些圖像?您還可以運行調度程序以定期作爲異步進程調用wget。 – dinukadev

+0

這也是我的第一本能。但是,需要的圖像數量非常巨大。我不確定確切的金額,但絕對大於1噸並不斷擴大。 –

+0

我最終通過哈希碼對圖像進行索引,並使用調度程序將大量常用圖像自動預緩存到數據庫中。到目前爲止,表現還在持續。 –

回答

2

由於數據庫存儲通常比文件系統存儲更昂貴,因此您可以將文件存儲在磁盤上,並在數據庫中存儲映像路徑。

對http get參數進行排序並將它們散列爲該圖像記錄的索引以供參數快速查詢。

,以確保你的程序不會壓壞當磁盤容量不夠的,你應該刪除未使用或很少使用的記錄:

商店lastAccessedTime每個記錄,在請求圖像時更新。

使用調度程序檢查lastAccessedTime,刪除低於指定權重的記錄。 您可以使用不同的策略來計算權重,如lastAccessedTime,accessibleCount,圖像大小等。

+0

我喜歡你的清理舊文件的策略。由於我的數據庫位於硬件上,因此我不確定磁盤上的文件與數據庫有關係。 –

1

您可以將所有提供給渲染管道的參數以可預測的方式轉換爲單個字符串,以便可以計算輸入的SHA1哈希值,然後將輸出文件存儲在以SHA1作爲文件的目錄中名字,這樣,如果你得到一個具有相同參數的請求,你只需計算哈希值,然後檢查該文件是否在磁盤上,如果它返回它,否則將工作發送到渲染管道並創建文件。

如果你有很多文件,你可能想要使用多個目錄,也許看看git的頭幾個字符是如何通過目錄在文件夾之間分割文件以獲取靈感的。

我在我的應用程序上使用類似的設置我沒有在渲染只是存儲文件,文件存儲在數據庫中,但出於性能原因,我使用文件內容的sha1散列作爲文件名/該文件的URI。

+0

好主意。給我很多想法。 –