我有一个字符串的缓存,布尔值:
Cache<String, Boolean> myCache = CacheBuilder.newBuilder().build();
我的使用模式是:
if (myCache.get("some-key") == null) {
// "some-key" not in cache, do stuff, then insert it
myCache.put("some-key", Boolean.TRUE);
}
else {
// "some-key" already in cache
}
我正试图改变这一点,使它使用替代品 get
方法,该方法接受加载程序函数 get(K key, Callable<? extends V> loader)
,以避免两个线程都调用 myCache.get("some-key") == null
两者都进入if块。
我不确定下面的方法是否正确?
我想 myCache.get("some-key", myCacheLoader)
将插入 some-key
如果它不存在,我也需要知道它是否存在,所以我不认为下面的代码是正确的。
CacheLoader<String, Boolean> myCacheLoader = createMyCacheLoader();
Cache<String, Boolean> myCache = CacheBuilder.newBuilder().build();
private static CacheLoader<String, Boolean> createMyCacheLoader(){
return new CacheLoader<String, Boolean>(){
@Override
public Boolean load(final String key){
return Boolean.TRUE;
}
};
}
if (!myCache.get("some-key", myCacheLoader)) { // I don't think this can ever be false?
// I don't think if block will ever be entered?
// How can I find out if an item isn't in the cache when using a loading cache?
}
else {
// "some-key" already in cache
}
1条答案
按热度按时间bf1o4zei1#
建造
LoadingCache
而不是Cache
与CacheLoader
去实现你想要的。请参考guava CachesExplaned wiki页面,具体如下:加载缓存是
Cache
用一个附加的CacheLoader
. (...) 查询LoadingCache
与方法一致get(K)
. 这将返回一个已经缓存的值,或者使用缓存的CacheLoader
以原子方式将新值加载到缓存中。就你而言: