2016-02-17 35 views
0

嗨我是新的谷歌番石榴集合,所以我需要集合,這將過期一段時間.So我已經寫了下面的代碼,但它不會刪除數據過期time.Can任何人都可以告訴我什麼是代碼問題。番石榴CacheBuilder不按預期工作

Cache<String, Object> cache = CacheBuilder.newBuilder() 
       .expireAfterAccess(2, TimeUnit.MILLISECONDS) 
       .build(); 
     Object object = new Object();    
     cache.put(object.getId(), object); 
     System.out.println("size :" + cache.size()); 
     Thread.sleep(50000); 
     System.out.println("After Size :" + cache.size()); 

我需要添加對象映射和到期時間它將從map.But後線程包含在地圖對象之前刪除上面的代碼之後。

回答

4

expireAfterAccess狀態的Javadoc:

過期的條目可以在Cache.size()進行計數,但絕不是可見的讀取或寫入操作。過期的條目將作爲javadoc類中描述的日常維護的一部分進行清理。

這意味着即使條目以.size()計數,它們在任何其他操作中都將不可見。

這些無效條目將被自動刪除。據javadoc的,這發生在以下幾種情況:

  • 的條目使用get訪問:
    地圖看到該條目是過時的,直接刪除它。
  • 偶爾會發生緩存訪問:
    有時訪問.get()方法會觸發內部清理,javadoc沒有爲此定義任何週期。
  • 手動撥打Cache.cleanUp()
    這會直接觸發清除程序並刪除所有過期的條目。

更多信息似乎在Github Wiki of the cache class中進行了解釋。

如果您想在刪除條目時發出通知,可以使用RemovalListener。您可以使用.removalListener(...)在cachebuilder上設置此偵聽器。

+0

嗨感謝您的回覆。我想知道如何從緩存映射中讀取值並寫入緩存映射。這與我們在標準java映射中執行的操作一樣。 – Sajithv

+0

當我在睡眠之前添加cache.getIfPresent(「123」)時,它將返回空值。「123」是我添加的對象的關鍵。 – Sajithv

+0

對不起,哥們,這是我的錯。謝謝你的幫助。 – Sajithv