use*_*151 4 java caching guava
我正在使用Guava Cache在内存中缓存大约100K记录.我cache.putAll(Map<K,V>)用来预加载缓存.加载大约20K记录后,我看到删除通知,原因是'REPLACED'.所有条目的最大大小为1GB,重量为1,expireAfterAccess为24小时.所有记录都足够1GB.如何确保在24小时之前没有更换任何条目?
MyCacheLoader cacheLoader = new MyCacheLoader();
CacheBuilder<Long, Map<String, List<String>>> cacheBuilder = CacheBuilder.newBuilder().
initialCapacity(1024 * 1024 * 1024).
//maximumSize(1024 * 1024 * 1024).
maximumWeight(1000000).
weigher(new Weigher<Long, Map<String, List<String>>>(){
public int weigh(Long arg0, Map<String, List<String>> arg1) {
return 1;
}
}).
concurrencyLevel(1).
expireAfterAccess(24, TimeUnit.HOURS);
cache = cacheBuilder.build(cacheLoader);
Run Code Online (Sandbox Code Playgroud)
我的猜测是你可能会添加重复的密钥.
UPDATE
来自JavaDocs RemovalCause.REPLACED:
条目本身实际上并未删除,但其值已被用户替换.这可以由用户调用Cache.put(K,V),LoadingCache.refresh(K),Map.put(K,V),Map.putAll(java.util.Map),ConcurrentMap.replace(Object,Object)引起),或ConcurrentMap.replace(Object,Object,Object).
因此,由于它不是a LoadingCache,从文档判断,这只留下两种可能性:重复或错误.
从LocalCache零来源,零重量意味着不可驱逐的对象:
ReferenceEntry<K, V> getNextEvictable() {
for (ReferenceEntry<K, V> e : accessQueue) {
int weight = e.getValueReference().getWeight();
if (weight > 0) {
return e;
}
}
throw new AssertionError();
}
Run Code Online (Sandbox Code Playgroud)