2012-06-13 22 views
6

我正在使用CacheBuilderLoadingCache來實現數據庫數據的內存中緩存。Guava LoadingCache - 如何處理支持存儲中不存在的密鑰

假設客戶端在緩存中查詢後備存儲中不存在的項目。我希望客戶端知道沒有找到指定密鑰的數據。處理這個問題的最佳方法是什麼?

  • 在緩存中存儲表示「無數據」的特殊值。
  • 在緩存中不存儲任何內容並引發異常。
  • 其他想法?
+3

嗯......這是否代表一種特殊的情況,或者這是您的程序中的正常情況?如果第一個,拋出異常,如果第二個,存儲一個特殊值。 –

+0

我在路易斯的後一種情況下有點不情願地使用了「可選」。 – Ray

+0

就我而言,「無數據」是有意義的。最初,我試圖將null存儲在緩存中,由於InvalidCacheLoadException而失敗。感謝您的建議,雷。在這裏也發現了一些很好的信息:http://stackoverflow.com/questions/8298285/handle-null-value-using-guava-mapmaker-cachebuilder – frankadelic

回答

9

我一直以下面的方式解決這個問題。

interface KeyValueService<K,V> { 
    V get(K key); 
} 

class CachingKeyValueService<K,V> { 
    Cache<K,Optional<V>> cache; 
    V get(K key) { 
     return cache.get(key).orNull(); 
    } 

} 

理想情況下,您將更改KeyValueService的接口始終返回可選,但有時這是不可能的。

您可以使用加權來使所有Optional.ABSENT引用快速被逐出。

+0

我不認爲你可以使用稱量導致Optional.ABSENT被驅逐很快。從CacheBuilder文檔:「權重只用於確定緩存是否超出容量;它不會影響選擇哪個條目應該被驅逐」。 – frankadelic

+0

你是對的,因爲它不會幫助選擇,但是一旦它開始驅逐,它將持續驅逐直到它處於重量之下,如果你使Optional.ABSENT的重量低於一個普通物體,它們將在驅逐週期。標準的LRU規則當然仍然適用。 – Emily