谷歌番石榴检查缓存中的项目

时间:2015-06-01 16:00:05

标签: java caching guava

我正在尝试在程序上使用google guava缓存,但我还没弄到它是如何工作的。

我正在加载缓存,然后在稍后阶段我试图检查缓存中是否存在某个项目,我的代码下面的代码不能正常工作

如果getIfPresent不存在,则返回null,但调用它的负载在出错后会弹出

线程“main”中的异常com.google.common.cache.CacheLoader $ InvalidCacheLoadException:CacheLoader为键返回null

 private static LoadingCache<String, Image> imageCache
          = CacheBuilder.newBuilder()
                .build(new CacheLoader<String, Image>() {

            @Override
            public Image load(String key) throws Exception {                    
                if (getImage(key) != null) {                    
                    return getImage(key);                       
                }               
                return null;
            }                 
          });           

public static Image getImage(String key) throws ExecutionException {

    return imageCache.getIfPresent(key);

}

这意味着我无法检查缓存中项目的存在,如此

    try {
        readImage = imageCache.get(fileName);
    } catch (ExecutionException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    if (readImage != null) {


    }

有人可以向我解释我在这里做错了吗?

3 个答案:

答案 0 :(得分:4)

如果您需要在Loader中管理空值,请使用Guava Optional

@Override
public Optional<Image> load(String key) throws Exception {
    return Optional.fromNullable(getImage(key));
}

Image getImage(String key) throws ExecutionException {
    //your code to get image from database, or other source
    return yourCodeToGetImageFromTheSource(key);
}

您的客户端代码可以是:

try {
    Optional<Image> imageCached = imageCache.get(fileName);
} catch (ExecutionException e1) {
    // TODO error handling
}

if (imageCached.isPresent()) {
    Image img = imageCached.get();
} else {
    //your code when img is null
}

答案 1 :(得分:2)

首先,您不能return null方法load。 如果您想检查缓存中是否存在某个密钥,只需在ConcurrentMap中通过

获取LoadingCache即可。

Map<K,V> imageMap = imageCache.asMap()

只需将该地图用作任何其他地图,即使用地图上的containsKey方法检查是否存在密钥等等

答案 2 :(得分:1)

CacheLoader#load(String)州的javadoc

  

<强>参数

     
      
  • key 应加载其值的非null键
  •   
     

<强>返回

     
      
  • 与密钥相关的值; 不得为空
  •   
     

<强>抛出

     
      
  • 例外 - 如果无法加载结果
  •   

您已将其实施为返回null,这违反了CacheLoader合同。