问题描述
Google Guava的CacheBuilder允许使用到期密钥创建ConcurrentHash,这些密钥允许在固定的平局之后删除条目.但是,我只需要缓存一个特定类型的实例.
Google Guava has CacheBuilder that allows to create ConcurrentHash with expiring keys that allow to remove entries after the fixed tiemout. However I need to cache only one instance of certain type.
使用Google Guava在固定的超时时间内缓存单个对象的最佳方法是什么?
What is the best way to cache single object within fixed timeout using Google Guava?
推荐答案
我会使用Guava的 Suppliers.memoizeWithExpiration(供应商委托,持续时间长, TimeUnit单位)
I'd use Guava's Suppliers.memoizeWithExpiration(Supplier delegate, long duration, TimeUnit unit)
public class JdkVersionService {
@Inject
private JdkVersionWebService jdkVersionWebService;
// No need to check too often. Once a year will be good :)
private final Supplier<JdkVersion> latestJdkVersionCache
= Suppliers.memoizeWithExpiration(jdkVersionSupplier(), 365, TimeUnit.DAYS);
public JdkVersion getLatestJdkVersion() {
return latestJdkVersionCache.get();
}
private Supplier<JdkVersion> jdkVersionSupplier() {
return new Supplier<JdkVersion>() {
public JdkVersion get() {
return jdkVersionWebService.checkLatestJdkVersion();
}
};
}
}
使用JDK 8更新
今天,我将使用JDK 8方法参考和构造函数注入来编写更清晰的代码,以不同的方式编写此代码:
Update with JDK 8
Today, I would write this code differently, using JDK 8 method references and constructor injection for cleaner code:
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.google.common.base.Suppliers;
@Service
public class JdkVersionService {
private final Supplier<JdkVersion> latestJdkVersionCache;
@Inject
public JdkVersionService(JdkVersionWebService jdkVersionWebService) {
this.latestJdkVersionCache = Suppliers.memoizeWithExpiration(
jdkVersionWebService::checkLatestJdkVersion,
365, TimeUnit.DAYS
);
}
public JdkVersion getLatestJdkVersion() {
return latestJdkVersionCache.get();
}
}
这篇关于在固定的超时时间内缓存单个对象的最佳方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!