有人可以帮我理解Guava CacheLoader吗?

car*_*tex 28 caching guava

我是Google的Guava库的新手,对Guava的Caching包很感兴趣.目前我已经下载了10.0.1版.在查看文档之后,JUnit测试了源代码,甚至在广泛搜索谷歌之后,我仍然无法弄清楚如何使用缓存包.文档非常简短,好像它是为那些一直使用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; // ?????
         }
       });
Run Code Online (Sandbox Code Playgroud)

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

要将项添加到mycache,我使用以下代码:

mycache.asMap().put("key123", "value123");
Run Code Online (Sandbox Code Playgroud)

要从mycache获取项目,我使用此方法:

mycache.get("key123")
Run Code Online (Sandbox Code Playgroud)

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

Col*_*inD 38

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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢.现在我明白了.这个例子应该在文档上.不知道如何使文档更清晰,一个真实世界的例子对于像我这样的菜鸟总是更好. (2认同)
  • 实际上上面的代码应该是`LoadingCache`而不是`Cache`,它没有`get(key)`方法. (2认同)