2013-04-17 16 views
2

我有一個Java服務,它通過數據庫查找將String鍵轉換爲Long id。我將它封裝在一個Guava Cache中以減少數據庫查詢。從key到id的映射一旦設置就不會改變,所以我可以使用現有密鑰的過期時間。但是有一個時間問題(不是在Guava中,而是在我的應用程序中),有人可能會在密鑰進入數據庫之前查找密鑰的ID。我不想將這個「缺失」映射緩存很長時間。儘管如此,我仍然希望將其緩存起來,以避免查詢同一個缺失的密鑰。如何讓缺失條目在Guava中更快地過期

我讀到這個問題:Handle null value ...,從那裏我拼湊出一個解決方案與2個緩存。我有一個「丟失鍵」的緩存,我讓它更快地過期,並且沒有自動加載功能。我首先檢查這個緩存,如果我發現有什麼我知道這是一個缺失的關鍵。否則,我嘗試「真正的」緩存,捕獲ExecutionException以指示「丟失」,然後手動填充「丟失的鍵」緩存。這感覺很尷尬,尤其是在沒有映射的情況下,我在加載方法中拋出異常的部分。所以我想知道是否沒有更好的方法來處理這類問題。

+0

這感覺不自然,但我認爲(鑑於我所瞭解的),它仍然是最靈活的解決方案。特別是因爲你也可以有不同的大小/驅逐設置,你會得到兩個統計數據。 – eckes

回答

1

你可能會基於refresh,在那裏你實現CacheLoader.reload(key, oldValue)積極刷新「失蹤」映射嘗試的東西,你只是保持oldValue如果oldValue沒有「失蹤」。

+0

有趣的想法。所以我會將refreshAfterWrite設置爲我想要緩存缺失值的長度,然後中止重新加載(通過保留舊值),如果它沒有丟失。我擔心的是我會有大量的虛假刷新(雖然實際上並沒有太多),這可能是刷新線程的性能問題。我會測試一下,看看我是否比2緩存解決方案更好。 – jfrank

+0

另外我剛剛意識到這會讓我無法對非缺失緩存條目進行「正常」刷新。在這種情況下,這不是問題,因爲緩存的數據不能更改,但在其他情況下,這可能是一個問題。 – jfrank

+0

我有一個similliar方法。在我的特殊情況下,refresh()會檢測到需要刪除一個條目,並且CacheLoader中似乎沒有這樣做的方法。 – eckes