Le blog de Fabien DUMINY

Un blog utilisant WordPress

Skip to: Content | Sidebar | Footer

Devoxx France 2012 – Cache Java avec Guava

9 mai, 2012 (09:00) | Devoxx France 2012, Evènement, Java | By: fabien

A l’occasion de Devoxx France 2012, j’ai assisté à la conférence intitulée Cache Java avec Guava présentée par Charles Fry.

La librairie Guava Cache fonctionne un niveau au dessus de ConcurrentHashmap mais n’offre pas autant de fonctionnalités que Ehcache. Les caches de Guava ne sont pas pré-chargés par défaut et sont tous thread safe. Le chargement d’un cache se fait avec une implémentation de la classe abstraite CacheLoader.

La construction d’un cache se fait progressivement, en commençant par un appel à la méthode statique CacheBuilder.newBuilder(), puis en chaînant les appels aux méthodes de la classe CacheBuilder. Cela permet de spécifier sa configuration et notamment sa stratégie d’éviction des valeurs : valeur utilisée le moins récemment avec expireAfterAccess(long, TimeUnit), valeur modifiée le moins récemment avec expireAfterWrite(long, TimeUnit) … En plus du temps qui s’écoule, l’éviction de valeurs peut aussi être déclenchée en spécifiant le poids total maximum du cache par un appel à maximumWeight(long), qu’il faut combiner avec un appel à weigher(Weighter) pour indiquer comment peser une entrée du cache.
La construction du cache se termine en appelant build() ou build(CacheLoader), qui renvoient une nouvelle instance de Cache.

En plus des fonctionnalités classiques, les statistiques du cache peuvent être activées en appelant recordStats(). L’utilisation de la méthode removalListener(RemovalListener) permet de savoir quand une valeur vient d’être supprimée du cache. Par défaut, cette notification est synchrone, ce qui peut ralentir les opérations sur le cache. Pour traiter les notifications de manière asynchrone, vous pouvez encapsuler votre RemovalListener en appelant RemovalListeners.asynchronous(RemovalListener, Executor). Lors de la construction du cache, en appelant refreshAfterWrite(long, TimeUnit), on programme le rafraîchissement automatique d’une valeur un certain temps après sa création ou sa dernière modification. Dans certains cas, il peut être plus intéressant de charger toutes les valeurs du cache en une seule fois en surchargeant la méthode CacheLoader.loadAll(Iterable).

Parmi les autres fonctionnalités, on trouve Cache.get(K, Callable) pour récupérer une valeur dans le cache en spécifiant comment l’y ajouter si elle est absente. Dans ce cas, un unique appel au Callable est fait par le cache, même si plusieurs threads demandent la valeur pour cette clé. Enfin, il est possible d’obtenir une vue du cache sous la forme d’une ConcurrentMap en appelant asMap().

Be Sociable, Share!
Share and Enjoy

Write a comment





If your website is claim enabled, it will be notified that you have posted here.

MySQL query error