Caching 有人能帮我理解番石榴吗?

Caching 有人能帮我理解番石榴吗?,caching,guava,Caching,Guava,我是谷歌Guava库的新手,对Guava的缓存包很感兴趣。目前我已经下载了10.0.1版。在查看了文档之后,JUnit测试了源代码,甚至在广泛搜索了google之后,我仍然不知道如何使用缓存包。文档非常简短,好像它是为一直在使用Guava库的人编写的,而不是为像我这样的新手编写的。我只希望有更多关于如何正确使用缓存包的真实例子 假设我想用最近最少使用(LRU)逐出方法构建一个包含10个未过期项的缓存。因此,根据api中的示例,我构建了如下代码: Cache<String, String&g

我是谷歌Guava库的新手,对Guava的缓存包很感兴趣。目前我已经下载了10.0.1版。在查看了文档之后,JUnit测试了源代码,甚至在广泛搜索了google之后,我仍然不知道如何使用缓存包。文档非常简短,好像它是为一直在使用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; // ?????
         }
       });
要从mycache获取项目,我使用以下方法:

mycache.get("key123")

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

番石榴的
缓存类型通常用于计算缓存。您通常不会手动向其添加值。相反,您告诉它如何为键加载昂贵的计算值,方法是给它一个包含必要代码的
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);
}
private final FooDatabase FooDatabase=。。。;
private final LoadingCache cache=CacheBuilder.newBuilder()
.最大尺寸(10)
.build(新的缓存加载程序(){
公共Foo加载(长id){
返回fooDatabase.getFoo(id);
}
});
公共Foo getFoo(长id){
//永远不需要手动将Foo放入…如果需要,将从DB加载
返回cache.getUnchecked(id);
}

此外,我还尝试了您给出的示例,并按预期返回了
“value123”

OP,我想知道如何调整示例,使其更清晰?谢谢。现在我明白了。这个例子应该在文档中。不知道如何使文档更清晰,对于像我这样的noob来说,一个真实世界的示例总是更好。@user997496:
CacheBuilder
的文档有一个类似的示例,只是它使用基于键的“创建昂贵的图”,而不是“从数据库加载值”正如
CacheLoader
所做的操作一样。ColinD说“永远不需要手动放入Foo…如果需要,将从DB加载”的部分确实击中了我的G点。实际上上面的代码应该读取
LoadingCache
而不是
Cache
,因为它没有
get(key)
方法。
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);
}