2016-02-07 36 views
1

可以使用最大尺寸1的番石榴高速緩存嗎?番石榴高速緩存最大尺寸1

我在讀,有時甚至在達到最大尺寸之前可能會被驅逐。

但是,我只需要一個緩存條目。所以我想知道什麼值設置爲最大尺寸,這將是安全的,但不是過度。

+2

最有可能使用[Suppliers.memoize](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Suppliers.html#memoize(com.google.common。 base.Supplier))或者'AtomicReference'是單條緩存更好的匹配。 –

+0

[緩存 - 在java中的一個對象的線程安全的緩存](https://stackoverflow.com/questions/3636244/thread-safe-cache-of-one-object-in-java) – ycomp

回答

1

您應該可以使用Cache.cleanUp(),如When Does Cleanup Happen?中所述,並測試最大尺寸是否滿足您的需求。

例如下面顯示了直到一個不同的項目被裝載到它的位置使用LoadingCache與1最大規模不會驅逐現有的條目:

final LoadingCache<Character, Integer> loadingCache = CacheBuilder.newBuilder() 
     .maximumSize(1) 
     .build(new CacheLoader<Object, Integer>() { 
      private final AtomicInteger loadInvocationCount = new AtomicInteger(); 

      @Override 
      public Integer load(Object key) throws Exception { 
       return loadInvocationCount.getAndIncrement(); 
      } 
     }); 
assert loadingCache.size() == 0; 

assert loadingCache.getUnchecked('a') == 0; 
assert loadingCache.size() == 1; 

loadingCache.cleanUp(); 
assert loadingCache.size() == 1; 

assert loadingCache.getUnchecked('a') == 0; 
assert loadingCache.size() == 1; 

assert loadingCache.getUnchecked('b') == 1; 
assert loadingCache.size() == 1; 

loadingCache.cleanUp(); 
assert loadingCache.size() == 1; 

assert loadingCache.getUnchecked('a') == 2; 
assert loadingCache.size() == 1; 

loadingCache.cleanUp(); 
assert loadingCache.size() == 1; 

注意,這可能是特定的LoadingCache正在修建這樣的類型您需要測試您計劃使用的任何配置。

+0

謝謝,我使用'Suppliers.memoizeWithExpiration()'來代替,因爲基本上這是我正在尋找的功能 - 在給定的時間內緩存1個對象。當我發表原帖時,我並不知道「備忘錄」。 – ycomp