我正在使用CacheBuilder和LoadingCache來實現數據庫數據的內存中緩存。Guava LoadingCache - 如何處理支持存儲中不存在的密鑰
假設客戶端在緩存中查詢後備存儲中不存在的項目。我希望客戶端知道沒有找到指定密鑰的數據。處理這個問題的最佳方法是什麼?
- 在緩存中存儲表示「無數據」的特殊值。
- 在緩存中不存儲任何內容並引發異常。
- 其他想法?
我正在使用CacheBuilder和LoadingCache來實現數據庫數據的內存中緩存。Guava LoadingCache - 如何處理支持存儲中不存在的密鑰
假設客戶端在緩存中查詢後備存儲中不存在的項目。我希望客戶端知道沒有找到指定密鑰的數據。處理這個問題的最佳方法是什麼?
我一直以下面的方式解決這個問題。
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引用快速被逐出。
我不認爲你可以使用稱量導致Optional.ABSENT被驅逐很快。從CacheBuilder文檔:「權重只用於確定緩存是否超出容量;它不會影響選擇哪個條目應該被驅逐」。 – frankadelic
你是對的,因爲它不會幫助選擇,但是一旦它開始驅逐,它將持續驅逐直到它處於重量之下,如果你使Optional.ABSENT的重量低於一個普通物體,它們將在驅逐週期。標準的LRU規則當然仍然適用。 – Emily
嗯......這是否代表一種特殊的情況,或者這是您的程序中的正常情況?如果第一個,拋出異常,如果第二個,存儲一個特殊值。 –
我在路易斯的後一種情況下有點不情願地使用了「可選」。 – Ray
就我而言,「無數據」是有意義的。最初,我試圖將null存儲在緩存中,由於InvalidCacheLoadException而失敗。感謝您的建議,雷。在這裏也發現了一些很好的信息:http://stackoverflow.com/questions/8298285/handle-null-value-using-guava-mapmaker-cachebuilder – frankadelic