2017-08-25 48 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,只是用缓存直接合作。