2017-09-10 73 views
1

我讀了解釋Guava Cache的文檔:CachesExplained。我明白了refreshAfterWrite和expireAfterWrite在做什麼。然而,在解釋refreshAfterWrite,該文件還提到了這一點:Guava LoadingCache:爲什麼使用refreshAfterWrite和expireAfterWrite在一起

因此,舉例來說,你可以同時指定refreshAfterWrite和expireAfterWrite在同一高速緩存,使一個條目的過期計時器不能盲目復位每當條目有資格進行刷新,因此如果條目在具有刷新資格後沒有被查詢,則允許其過期。

這是混淆了我的部分。據我的理解,如果你想要一個鍵自動刷新,你只需要指定refreshAfterWrite。爲什麼我們甚至想在使用refreshAfterWrite時使用expireAfterWrite?

回答

2

在某些情況下,您希望緩存的條目相關,因此您可以設置刷新持續時間(可能輕於執行(和異步),而不是驅逐後的完整提取,因此不同)但同時,如果您的緩存是有限的,您將需要驅逐條目,這就是expireAfterWrite的用途。通過設置它們兩個,即使刷新了一段時間,也會確保一個條目被驅逐。

還要注意,在他們的運作方式不同:

耳目一新的是不太一樣的驅逐。正如LoadingCache.refresh(K)中所指定的那樣,刷新密鑰可能會異步地加載密鑰的新值。舊的值(如果有的話)在鍵被刷新時仍然返回,與驅逐相反,這會迫使檢索等待直到重新加載該值。

+0

有意義。但我也有這個問題:如果我只是使用expireAfterWrite(),它應該也是對的? expireAfterWrite()會清除舊條目。每當我調用get()時,無論是緩存加載的新值還是緩存中的值,取決於值是否過期,都會返回給我。解釋refreshAfterWrite()的文件說這**只在查詢條目時實際啓動刷新**。那麼refreshAfterWrite()有什麼意義呢?你能舉個例子嗎? –

+0

刷新操作可能會更輕(異步),然後在驅逐後進行完整的讀取操作。我已將此註釋添加到答案主體。 –

+0

刷新將重置到期的寫入時間戳。意圖是有些條目可能非常熱門,並且當到期時,當呼叫者阻塞負載時,用戶可見的延遲。刷新允許重新加載活動條目而不產生此成本。如果不活躍,那麼到期將啓動並逐出。 –

相關問題