2017-08-25 26 views
1

我想使用番石榴作爲緩存,但我似乎無法找到番石榴有能力允許我加載多個項目並獲取多個項目。番石榴加載多個鍵並獲取多個項目

我看到的CacheLoader有以下幾點:

​​

而我需要加載的是:

@Override 
    public List<Value> load(List<String> keys) { 
     return getKeys(); 
    } 

我也期望得到一個或從緩存中的項目列表,但即使爲了獲得它而必須將這一項包裝到列表中,我也很開心。

我是新來的番石榴,我不確定番石榴是否有這樣的功能?

+0

那就是CacheLoader類吧? – DPM

+0

正確,CacheLoader。有沒有其他的番石榴提供的緩存,我不知道? – user3019766

+0

還不如我所見。我對這門課並不熟悉,但我想看看。作爲一般規則,我會根據需要在問題中提供儘可能多的信息。 – DPM

回答

0

您可以創建一個LoadingCache(只是如)爲:

private final LoadingCache<String, Object> cache; 

其中string可能是你的關鍵的數據類型和對象可以是你的價值的數據類型。

然後,您可以使用CacheBuilder作爲初始化它:

cache = CacheBuilder.newBuilder(). 
       initialCapacity(10). 
       maximumSize(50). 
       recordStats(). 
       build(new CacheLoader<String, Object>() { 
        @Override 
        public Object load(String s) throws Exception { 
         return null; 
        } 
       }); 

,並進一步實施方式可從基於密鑰的緩存值,並把一個值到緩存中的鍵值對在一定程度上這種格式:

public Object get(String key) { 
    try { 
     return cache.getIfPresent(key); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     return null; 
    } 
} 

public boolean put(String key, Object object) { 
    cache.put(key, object); 
    return true; 
} 
2

您可以使用CacheLoader.loadAll()加載多個項目,並LoadingCache.getAll()得到它們。

例如:

new CacheLoader<String, Value>() { 
    @Override 
    public Value load(String key) { 
     return getKey(); 
    } 

    @Override 
    public Map<String, Value> load(Iterable<? extends String> keys) { 
     return getKeys(); 
    } 
} 
//... 
List<String> keys = Arrays.asList("key1", "key2", "key3"); 
ImmutableMap<String, Value> values = cache.getAll(keys); 
+0

我不認爲這正是我正在尋找的......我想要的是將所有密鑰存儲在相同的地圖上。 EX: LIst Keys = Arrays.asList(「key1」,「key2」,「key3」); ImmutableMap value = cache.getAll(keys); cache.get(「key1」)// <---我希望這不會發出一個調用getKey()。 – user3019766

+0

我期待同樣的結果。爲什麼它會緩存兩次相同的密鑰? – shmosel

+0

我想我應該這樣陳述我的請求: 我想要加載的是四種不同的鍵,有兩種不同的方式: Hashamp map = new Hashmap <>(); map.add(「key1」,value1); map.add(「key2」,value2); String Key =「key4」; cache.load(keys) cache.load(key) 當我檢索密鑰時,我想以兩種不同的方式檢索: 緩存。getAll()//它返回給我value1,value2,value3,value4 – user3019766

0
Public class Cache { 
    private Cache<Key, Value> cache; 
    prviate DataDAO cataDao; 

    public Cache(DataDAO dataDao) { 
    _dataDao = DataDAO; 
    cache = CacheBuilder.newBuilder().build(); 
    } 

    public Value getValue(Key key) { 
    Value value; 
    if (cache.getIfPresent(key) == null) { 
     value = dataDao.getById(key); 
     cache.put(key, value); 
     return value; 
    }else{ 
     return cache.getIfPresent(key); 
    } 
    } 

    Public List<Value> getValues(List<Key> keys) { 
    List<Value> values = new ArrayList<>(); 
    List<Key> notInCacheKeys = new ArrayList<>(); 
    for (Key key: keys) { 
     if (cache.getIfPresent(key)) == null) { 
      notInCacheKeys.add(key); 
     } 
    } 
    List<Value> newlyRetrievedValues = _dataDao.getByIds(notInCacheKeys); 
    //Store Keys and Values in order 
    //Return value and list of values from cache 
    } 
} 

我已經決定放棄緩存加載器和LoadingCache,只是用緩存直接合作。