2017-08-25 4 views
1

Je voudrais utiliser Guava comme cache mais je n'arrive pas à trouver que Guava a la capacité de me permettre de charger plusieurs éléments et d'obtenir plusieurs éléments.Gava Charger plusieurs clés et obtenir plusieurs éléments

Je vois CacheLoader les éléments suivants sont:

@Override 
    public Value load(String key) { 
     return getKey(); 
    } 

Et ce que je dois charger est:

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

Je me attends aussi d'obtenir une ou une liste d'éléments du cache, mais Je suis heureux même si je devais envelopper cet élément dans une liste juste pour l'obtenir.

Je suis nouveau à Guava et je ne suis pas sûr si Guava a une telle fonctionnalité?

+0

C'est la classe CacheLoader, n'est-ce pas? – DPM

+0

Correct, CacheLoader. Y a-t-il un autre cache fourni par la goyave que je ne connais pas? – user3019766

+0

Pas aussi loin que je peux voir. Je ne suis pas familier avec cette classe, mais je voulais jeter un coup d'oeil. En règle générale, je mettrais autant d'informations dans une question que nécessaire. – DPM

Répondre

0

Vous pouvez créer un LoadingCache (juste pour par exemple) comme:

private final LoadingCache<String, Object> cache; 

où chaîne pourrait être le type de données de votre clé et l'objet pourrait être le type de données de votre valeur.

Vous pouvez ensuite initialiser en utilisant CacheBuilder comme:

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

et encore plus mettre en œuvre des méthodes pour obtenir une valeur à partir du cache en fonction de la clé et mettre une valeur dans le cache pour une paire de valeurs clé dans un peu ce format:

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

Vous pouvez utiliser CacheLoader.loadAll() pour charger plusieurs articles et LoadingCache.getAll() pour les obtenir.

Par exemple:

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

Je ne pense pas que ce soit exactement ce que je cherche ... ce que je voudrais avoir, c'est que toutes les clés soient stockées sur la même carte. EX: LIst Keys = Arrays.asList ("key1", "key2", "key3"); ImmutableMap value = cache.getAll (keys); cache.get ("key1") // <--- Je m'attends à ce que cela n'émette pas d'appel à getKey(). – user3019766

+0

Je m'attends à la même chose. Pourquoi mettrait-il deux fois la même clé en cache? – shmosel

+0

Je pense que je devrais formuler ma demande de cette façon: Ce que je veux charger sont quatre clés différentes de deux manières différentes: Hashamp map = new Hashmap <>(); map.add ("clé1", valeur1); map.add ("clé2", valeur2); String Key = "key4"; Cache.load (keys) cache.load (clé) Lorsque je récupère les clés, je souhaite récupérer de deux manières différentes: cache.getAll() // qui me renvoie 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 
    } 
} 

J'ai décidé d'abandonner CacheLoader et LoadingCache et juste travailler avec cache directement.