Вот мои настройки:
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);
}
});
И вот как я надеюсь использовать два кэша в тандеме:
optSampleInfo = nullInfoCache.getIfPresent(sampleId);
if (optSampleInfo == null || !optSampleInfo.isPresent()) {
optSampleInfo = infoCache.get(sampleId);
if (!optSampleInfo.isPresent()) {
nullInfoCache.put(sampleId, optSampleInfo);
infoCache.invalidate(sampleId);
}
}
Это не очень элегантно. Как мне сделать это лучше? Я не хочу использовать какие-либо специальные библиотеки кэширования. Я также не могу позволить себе вообще не кэшировать нули. Они просто должны быть кэшированы на гораздо более короткий период.