Java Google Guava loadAll可部分加载缓存
我需要缓存第三方rest服务返回的批量对象。我试图探索CacheLoader.loadAll()API,只有在缓存中未找到的所有对象都可以成功获取时,它才能与getAll()配合使用。如果我有一个局部情况,其中很少有对象被获取,也很少有对象没有被获取,那么这个api契约就会抛出 (loadAll未能返回键的值) 我想知道使用GoogleGuava支持上述用例的更好方法是什么Java Google Guava loadAll可部分加载缓存,java,guava,Java,Guava,我需要缓存第三方rest服务返回的批量对象。我试图探索CacheLoader.loadAll()API,只有在缓存中未找到的所有对象都可以成功获取时,它才能与getAll()配合使用。如果我有一个局部情况,其中很少有对象被获取,也很少有对象没有被获取,那么这个api契约就会抛出 (loadAll未能返回键的值) 我想知道使用GoogleGuava支持上述用例的更好方法是什么 this.cache = CacheBuilder.newBuilder().maximumSize(10
this.cache = CacheBuilder.newBuilder().maximumSize(1000).build(new CacheLoader<String, NamedEntity>() {
@Override
public Map<String, NamedEntity> loadAll(Iterable<? extends String> keys) throws Exception {
Map<String, NamedEntity> map = new ConcurrentHashMap<>();
for (NamedEntity namedEntity : client.getNamedEntities(keys)) {
map.put(namedEntity.getYkId(), namedEntity);
}
return map;
}
});
try {
entities = cache.getAll(keys);
} catch (Exception e) {
e.printStackTrace();
}
this.cache=CacheBuilder.newBuilder(){
@凌驾
public Map loadAll(IterableGuava缓存的后继者,允许从其
loadAll(键)中获得部分结果)
方法。在这种情况下,Map
将不包含缺少密钥的条目。感谢Ben。我还想知道咖啡因中多个线程对同一个密钥的缓存写入是否是线程安全的。咖啡因是线程安全的,并且与ConcurrentHashMap
具有相同的行为。如果您想改变该值,请执行以下操作:在asMap()下执行此操作.compute
方法来阻止对该键的其他写入。但是,与Guava一样,loadAll
是非阻塞的,因为它需要锁定多个条目,因此如果同时加载条目,它将进行替换。AsyncLoadingCache
支持阻塞loadAll
,因为它插入了CompletableFuture
要计算的代理。谢谢Ben。我还想知道何时调用StatCounter.RecordExcition()?我试图收集缓存统计指标&为此,我对StatCounter进行了子类化,但没有看到RecordExcition()在到期时间间隔设置完成时调用回调。Guava和Caffeine都默认在触发定期维护时退出,定期维护发生在写入或某些读取之后(或通过调用cleanUp()
)手动退出).caffee支持在使用计划程序
提供后台线程时发出提示通知。记录退出
在进行此维护时被调用。请尝试使用显式清理
或计划程序,看看这在测试中是否有效。