我是Google的Guava库的新手,并且对Guava的缓存包感兴趣。目前,我已经下载了10.0.1版。在查看了文档之后,JUnit测试了源代码,即使在广泛搜索google之后,我仍然不知道如何使用Caching包。该文档很短,好像是为使用Guava库而不是像我这样的新手的人编写的。我只是希望有更多有关如何正确使用缓存程序包的真实示例。

假设我要使用最近最少使用(LRU)驱逐方法构建10个未过期项目的缓存。因此,从api中的示例中,我将构建如下代码:

Cache<String, String> mycache = CacheBuilder.newBuilder()
   .maximumSize(10)
   .build(
       new CacheLoader<String, String>() {
         public String load(String key) throws Exception {
           return something; // ?????
         }
       });

由于需要CacheLoader,因此我必须将其包含在CacheBuilder的构建方法中。但是我不知道如何从mycache返回正确的值。

要将项目添加到mycache,我使用以下代码:
mycache.asMap().put("key123", "value123");

要从mycache获取项目,我使用以下方法:
mycache.get("key123")

get方法将始终返回我从CacheLoader的load方法返回的任何值,而不是从mycache获取该值。有人可以告诉我我错过了什么吗?

最佳答案

Guava的Cache类型通常旨在用作计算缓存。您通常不需要手动为其添加值。相反,您通过为它提供包含必要代码的CacheLoader来告诉它如何加载昂贵的计算键值。

一个典型的示例是从数据库加载值或进行昂贵的计算。

private final FooDatabase fooDatabase = ...;

private final LoadingCache<Long, Foo> cache = CacheBuilder.newBuilder()
    .maximumSize(10)
    .build(new CacheLoader<Long, Foo>() {
      public Foo load(Long id) {
        return fooDatabase.getFoo(id);
      }
    });

public Foo getFoo(long id) {
  // never need to manually put a Foo in... will be loaded from DB if needed
  return cache.getUnchecked(id);
}

此外,我尝试了您提供的示例,并且mycache.get("key123")按预期返回了"value123"

08-26 14:55