我是Google的Guava库的新手,对Guava的缓存包感兴趣。目前我已经下载了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; // ?????
}
});
由于CacheLoader是必需的,我必须将它包含在CacheBuilder的构建方法中。但我不知道如何从mycache中返回正确的值。
要将项目添加到mycache,我使用以下代码:
mycache.asMap().put("key123", "value123");
要从mycache获取项目,我使用此方法:
mycache.get("key123")
get方法将始终返回从CacheLoader的load方法返回的任何值,而不是从mycache获取值。有人可以告诉我我错过了什么吗?
答案 0 :(得分:37)
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"
。