如何避免从Guava Cache中删除条目

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)

And*_*hev 6

我的猜测是你可能会添加重复的密钥.

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)