2012-03-29 73 views
7

最新版本的優秀番石榴圖書館更新了緩存apis。現在,CacheBuilder擁有一個maxmimumWeight()方法來對高速緩存實施最大權重。 javadoc狀態:做番石榴緩存考慮重量在驅逐選擇?

指定緩存可能包含的條目的最大權重。重量 使用稱重器指定的稱重器確定,並且使用 此方法在調用 構建(com.google.common.cache.CacheLoader)之前需要相應調用稱重器。

請注意,緩存可能會在超出此限制之前驅逐一個條目。 隨着高速緩存大小增加接近最大值,高速緩存將會刪除不太可能再次使用的條目 。例如,高速緩存可能會刪除一個條目,因爲它最近還沒有被使用或經常使用。

當Cache需要驅逐一個條目時,它會考慮權重嗎?例如,如果重量較大的物品比任何小物品更頻繁地使用,但是比所有小物品一起使用的次數少,那麼保留幾個小重量的物品可能比一個大重量的物品更好。

+1

該文檔現在說:「請注意,權重僅用於確定緩存是否超出容量;對選擇下一個應該逐出的條目沒有影響。」 http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheBuilder.html#maximumSize(long) – 2014-02-22 03:14:57

回答

12

番石榴團隊成員在這裏。

隨着高速緩存大小增加到接近最大值,高速緩存清除了不太可能再次使用的條目。例如,高速緩存可能會驅逐一個條目,因爲它最近還沒有被使用或經常使用。

如果緩存有任何其他行爲,它沒有記錄(也不應該依賴)。這就是說,目前執行只有關於最關心的,最近訪問的,如果你看一下the source

while (totalWeight > maxSegmentWeight) { 
    ReferenceEntry<K, V> e = getNextEvictable(); 
    if (!removeEntry(e, e.getHash(), RemovalCause.SIZE)) { 
    throw new AssertionError(); 
    } 
} 

getNextEvictable迭代才能的最近最少訪問。