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

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

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

  1. Cache<String, Boolean> myCache = CacheBuilder.newBuilder().build();

我的使用模式是:

  1. if (myCache.get("some-key") == null) {
  2. // "some-key" not in cache, do stuff, then insert it
  3. myCache.put("some-key", Boolean.TRUE);
  4. }
  5. else {
  6. // "some-key" already in cache
  7. }

我正试图改变这一点,使它使用替代品 get 方法,该方法接受加载程序函数 get(K key, Callable<? extends V> loader) ,以避免两个线程都调用 myCache.get("some-key") == null 两者都进入if块。
我不确定下面的方法是否正确?
我想 myCache.get("some-key", myCacheLoader) 将插入 some-key 如果它不存在,我也需要知道它是否存在,所以我不认为下面的代码是正确的。

  1. CacheLoader<String, Boolean> myCacheLoader = createMyCacheLoader();
  2. Cache<String, Boolean> myCache = CacheBuilder.newBuilder().build();
  3. private static CacheLoader<String, Boolean> createMyCacheLoader(){
  4. return new CacheLoader<String, Boolean>(){
  5. @Override
  6. public Boolean load(final String key){
  7. return Boolean.TRUE;
  8. }
  9. };
  10. }
  11. if (!myCache.get("some-key", myCacheLoader)) { // I don't think this can ever be false?
  12. // I don't think if block will ever be entered?
  13. // How can I find out if an item isn't in the cache when using a loading cache?
  14. }
  15. else {
  16. // "some-key" already in cache
  17. }
bf1o4zei

bf1o4zei1#

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

  1. CacheLoader<String, Boolean> myCacheLoader = CacheLoader.from(key -> Boolean.TRUE);
  2. LoadingCache<String, Boolean> myCache = CacheBuilder.newBuilder()
  3. // optional config for LoadingCache
  4. .build(myCacheLoader);
  5. // or even inlined:
  6. LoadingCache<String, Boolean> myCache = CacheBuilder.newBuilder()
  7. // optional config for LoadingCache
  8. .build(CacheLoader.from(key -> Boolean.TRUE));
  9. try {
  10. final Boolean isValuePresent = myCache.get("some-key");
  11. } catch (ExecutionException e) {
  12. throw new UncheckedExecutionException(e.getCause()); // or whatever
  13. }
  14. final Boolean isAnotherValuePresent = myCache.getUnchecked("some-key-as-well");
展开查看全部

相关问题