2014-09-24 79 views
10
private Cache<Long, Response> responseCache = CacheBuilder.newBuilder() 
      .maximumSize(10000) 
      .expireAfterWrite(10, TimeUnit.MINUTES) 
      .build(); 

我期待的是未在10分鐘內發送到客戶端的響應對象過期,自動從緩存中刪除,但我注意到,響應對象並不總是得到過期即使在10,15,20分鐘後。當大量填充緩存時,它們確實會過期,但當系統變爲空閒狀態時,如最後500個響應對象,它會停止刪除這些對象。 有人可以幫助理解這種行爲嗎?謝謝番石榴緩存「expireAfterWrite」似乎並不總是工作

+0

https://code.google.com/p/guava-libraries/wiki/CachesExplained#When_Does_Cleanup_Happen%3F – 2014-09-24 21:36:10

+0

太好了,謝謝你呀 – Mark1234 2014-09-24 21:40:53

回答

15

這是在文檔中指定:

如果請求expireAfterWrite或expireAfterAccess條目可以在每個高速緩存的修改被驅逐,在偶爾的高速緩存訪​​問,或調用Cache.cleanUp()。過期的條目可能被Cache.size()計算在內,但對於讀取或寫入操作永遠不可見。

還有的在wiki上更多詳細信息:

緩存與CacheBuilder建不進行清理和驅逐值「自動」,或立即值到期後,或諸如此類的事。相反,它在寫入操作期間執行少量維護,或者在寫入操作很少時偶爾進行讀取操作。我們需要創建一個線程,其 操作將與用戶對共享鎖的操作進行競爭。 此外,某些環境會限制線程的創建, 會使CacheBuilder在該環境中無法使用。

取而代之,我們將選擇放在您的手中。如果您的緩存是高吞吐量的 ,那麼您不必擔心執行緩存 維護來清理過期的條目等。如果您的緩存 確實只寫很少,並且您不希望清理阻止緩存 讀取,則您可能希望創建自己的維護線程,並定期調用 Cache.cleanUp()。

如果您想爲緩存中的日常緩存維護安排日程安排,那麼 很少寫入,只需使用 ScheduledExecutorService安排維護。

+0

,謝謝。 – Mark1234 2014-09-26 13:23:21

+0

只是從文檔複製,沒有留下印象 – 2016-09-30 14:46:49

+17

@SimonGuo我寫了很多文檔。 – 2016-09-30 15:32:20