使用< string,boolean>加载缓存的正确用法?

qjp7pelc  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(422)

我有一个字符串的缓存,布尔值:

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 
}
bf1o4zei

bf1o4zei1#

建造 LoadingCache 而不是 CacheCacheLoader 去实现你想要的。请参考guava CachesExplaned wiki页面,具体如下:
加载缓存是 Cache 用一个附加的 CacheLoader . (...) 查询 LoadingCache 与方法一致 get(K) . 这将返回一个已经缓存的值,或者使用缓存的 CacheLoader 以原子方式将新值加载到缓存中。
就你而言:

CacheLoader<String, Boolean> myCacheLoader = CacheLoader.from(key -> Boolean.TRUE);
    LoadingCache<String, Boolean> myCache = CacheBuilder.newBuilder()
            // optional config for LoadingCache
            .build(myCacheLoader);

    // or even inlined:
    LoadingCache<String, Boolean> myCache = CacheBuilder.newBuilder()
            // optional config for LoadingCache
            .build(CacheLoader.from(key -> Boolean.TRUE));

    try {
        final Boolean isValuePresent = myCache.get("some-key");
    } catch (ExecutionException e) {
        throw new UncheckedExecutionException(e.getCause()); // or whatever
    }

    final Boolean isAnotherValuePresent = myCache.getUnchecked("some-key-as-well");

相关问题