Java 一个只使用Google Guava的缓存系统的优雅实现,允许空值以不同于非空值的过期时间进行缓存?
以下是我的设置:Java 一个只使用Google Guava的缓存系统的优雅实现,允许空值以不同于非空值的过期时间进行缓存?,java,caching,guava,Java,Caching,Guava,以下是我的设置: private final LoadingCache<String, Optional<SampleInfo>> infoCache; private final LoadingCache<String, Optional<SampleInfo>> nullInfoCache; this.infoCache = CacheBuilder.newBuilder()
private final LoadingCache<String, Optional<SampleInfo>> infoCache;
private final LoadingCache<String, Optional<SampleInfo>> nullInfoCache;
this.infoCache = CacheBuilder.newBuilder()
.expireAfterWrite(CACHE_EXPIRY_HOURS, TimeUnit.HOURS)
.build(new CacheLoader<String, Optional<SampleInfo>>() {
@Override
public Optional<SampleInfo> load(final String key) throws Exception {
return service.api(key);
}
});
this.nullInfoCache = CacheBuilder.newBuilder()
.expireAfterWrite(NULL_CACHE_EXPIRY_SECONDS, TimeUnit.SECONDS)
.build(new CacheLoader<String, Optional<SampleInfo>>() {
@Override
public Optional<SampleInfo> load(String key) throws Exception {
return service.api(key);
}
});
这不是很优雅。我怎样才能让它变得更好?我不希望使用任何特殊的缓存库。我也不能完全不缓存空值。它们只需要缓存更短的时间 也许可以将它们都封装在一个包装中?使用番石榴的继任者,以及一个自定义的
expireAfter(expire)
,根据可选的存在/不存在来计算不同的持续时间。你能详细说明一下@xtratic吗?
optSampleInfo = nullInfoCache.getIfPresent(sampleId);
if (optSampleInfo == null || !optSampleInfo.isPresent()) {
optSampleInfo = infoCache.get(sampleId);
if (!optSampleInfo.isPresent()) {
nullInfoCache.put(sampleId, optSampleInfo);
infoCache.invalidate(sampleId);
}
}