我有一个用例,其中加载缓存数据的方法是批量调用,但我永远不会使用 getAll 从缓存中获取数据。有没有办法让多个并发获取所有块在单个 loadAll 上?我不希望个人获取不同的键导致对数据源的多次调用。
cache.get(key1); // missing entry, starts refresh
cache.get(key2); // separate thread, already getting reloaded due to key1 miss
我想我必须在查看 LocalCache 后实现自己的同步,在我的数据访问器中使用类似于本地缓存的东西,它只允许每隔这么多时间单位调用一次。当调用通过时,使用单个赋值语句更新本地副本。
我是否缺少 Guava 缓存库中的某些内容?
编辑:
我正在考虑类似以下的事情。但是,它可能会在loadAll
完成时继续返回陈旧的数据。我希望一切都阻塞在load
,并且只有第一个请求会导致loadAll
继续。
public class DataCacheLoader extends CacheLoader<String, Double>
{
private final Cache<String, Double> cache;
private ConcurrentMap<String, Double> currentData;
private final AtomicBoolean isloading;
public DataCacheLoader( final Cache<String, Double> cache )
{
this.cache = cache;
isLoading = new AtomicBoolean( false );
}
@Override
public Double load( final String key ) throws Exception
{
if ( isLoading.compareAndSet( false, true ) )
{
cache.putAll( loadAll( Lists.newArrayList( key ) ) ) );
}
return currentData.get( key );
}
@Override
public Map<String, Double> loadAll(Iterable<? extends String> keys) throws Exception
{
currentData = source.getAllData();
return currentData;
}
}