【问题标题】:Can someone help me understand Guava CacheLoader?有人可以帮我理解 Guava CacheLoader 吗?
【发布时间】:2011-10-16 04:12:42
【问题描述】:

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

假设我想使用最近最少使用 (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 中获取值。谁能告诉我我错过了什么?

【问题讨论】:

    标签: caching guava


    【解决方案1】:

    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"

    【讨论】:

    • OP,我很想知道我们如何调整 docs.guava-libraries.googlecode.com/git/javadoc/com/google/… 中的示例,这样它会更清晰?
    • 谢谢。现在我明白了。这个例子应该在文档上。不知道如何使文档更清晰,对于像我这样的菜鸟来说,一个真实的例子总是会更好。
    • @user997496:CacheBuilder 的文档有一个类似的例子,除了它使用基于键的“创建昂贵的图”而不是“从数据库加载值”作为CacheLoader 会。
    • ColinD 说“永远不需要手动放入 Foo ......如果需要,将从 DB 中加载”的部分真的击中了我的 G 点。
    • 其实上面的代码应该是LoadingCache而不是Cache,它没有get(key)方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2021-05-30
    相关资源
    最近更新 更多