如何跳过/避免某些特定元素被 Guava Cache 缓存

How to skip / avoid some specific elements to be cached by Guava Cache

有没有办法使用 Guava Cache 不缓存某些特定元素?我仍然希望返回元素,但不缓存。

例如:

LoadingCache guavaCache;

public Element load(String key) {
  Element element = requestElement(key);

  if(element.isActive == false){
    guavaCache.dontCache(element);
  }

  return element;
}

我针对这个问题实施了一个解决方案:使 return 之后的元素无效。这将在插入元素后立即将其从缓存中删除。

缓存配置:

public Element load(String key) {
  return requestElement(key);
}

然后:

element = guavaCache.get(key);
if(element.isActive == false){
  guavaCache.invalidate(key)
}

这看起来不是很干净,但它是由 Guava 内部完成的。

一个简单的解决方案,避免将元素添加到缓存并在以后使其无效,是从源请求元素(不使用缓存)并在元素符合条件时将其添加到缓存。

element = cache.getIfPresent(key);

if(element == null){
  element = source.request(key);
  if(element != null && eligibleToCache(element)){
    cache.put(key, element)
  }
}

虽然你会失去缓存的功能。这种解决方案是为了避免将元素插入到缓存中而不得不在以后使它失效。