2012-03-29 36 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迭代才能的最近最少访问。