Comment actualiser automatiquement le cache en utilisant Google Guava?

J’utilise la bibliothèque Google Guava pour la mise en cache. Pour l’actualisation automatique du cache, nous pouvons procéder comme suit:

cache = CacheBuilder.newBuilder() .refreshAfterWrite(15, TimeUnit.MINUTES) .maximumSize(100) .build(....); 

Toutefois, des actualisations automatiques sont effectuées lorsque la première demande d’entrée périmée se produit .

Existe-t-il un moyen de l’actualiser automatiquement même si aucune demande de données de cache n’est venue Comme pour toutes les 15 minutes, les données en cache doivent être extraites de Db et chargées, peu importe si quelqu’un appelle les données en cache ou non.

En outre, le délai d’expiration du cache de Guava concerne le cache entier. Est-il possible d’expirer les valeurs de cache en fonction de la clé? Comme les données de cache avec la clé “NOT_SO_FREQ_CHANGE_DATA” à expirer toutes les 1 heure et les données avec la clé “FREQ_CHANGING_DATA” devraient expirer toutes les 15 minutes?

Guava ne fournit aucun moyen d’actualiser le cache en bloc, mais vous pouvez planifier une actualisation périodique vous-même:

 LoadingCache cache = CacheBuilder.newBuilder() .refreshAfterWrite(15, TimeUnit.MINUTES) .maximumSize(100) .build(new MyCacheLoader()); for (K key : cache.asMap().keySet()) { cache.refresh(key); } 

Mais dans ce cas, vous souhaiterez peut-être remplacer la CacheBuilder.reload(K, V) dans MyCacheLoader pour qu’elle fonctionne de manière asynchrone.

En ce qui concerne la deuxième question, non, vous ne pouvez pas définir d’expiration par entrée dans Guava.

1ère question Utilisez un exécuteur planifié pour lancer une actualisation périodique.

2ème question Si vous pouvez déduire votre stratégie d’expiration de votre clé de cache ou de la valeur précédemment mise en cache, il est possible d’actualiser vos données à des intervalles variables.

basé sur ceci: https://code.google.com/p/guava-libraries/wiki/CachesExplained#Refresh

 LoadingCache graphs = CacheBuilder.newBuilder() .refreshAfterWrite(1, TimeUnit.MINUTES) .build( new CacheLoader() { public Graph load(Key key) { // no checked exception return getGraphFromDatabase(key); } public ListenableFuture reload(final Key key, Graph prevGraph) { if (!needsRefresh(key,prevGraph)) { return Futures.immediateFuture(prevGraph); } else { // asynchronous! ListenableFutureTask task = ListenableFutureTask.create(new Callable() { public Graph call() { return getGraphFromDatabase(key); } }); executor.execute(task); return task; } } }); ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(); ses.scheduleWithFixedDelay( new Runnable() { public void run() { for (Key key : graphs.asMap().keySet()) { graphs.refresh(key); } } }, 0, UPDATE_INTERVAL, TimeUnit.MINUTES); 

Version JAVA 8 avec stream parallèle:

 Executors .newSingleThreadScheduledExecutor() .scheduleWithFixedDelay(() -> configurationCache .asMap() .keySet() .parallelStream() .forEach((key) -> configurationCache.refresh(key)), 0, 1, TimeUnit.SECONDS); 

Voici un exemple de code pour actualiser un cache. Le cache de goyave est facile à mettre en œuvre et rapide.

 import java.util.concurrent.ExecutionException import java.util.concurrent.TimeUnit; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; public class GuavaTest { private static GuavaTest INSTANCE = new GuavaTest(); public static GuavaTest getInstance(){ return INSTANCE; } private LoadingCache cache; private GuavaTest() { cache = CacheBuilder.newBuilder() .refreshAfterWrite(2,TimeUnit.SECONDS) .build(new CacheLoader() { @Override public Ssortingng load(Ssortingng arg0) throws Exception { return addCache(arg0); } }); } private Ssortingng addCache(Ssortingng arg0) { System.out.println("Adding Cache"); return arg0.toUpperCase(); } public Ssortingng getEntry(Ssortingng args) throws ExecutionException{ System.out.println(cache.size()); return cache.get(args); } public static void main(Ssortingng[] args) { GuavaTest gt = GuavaTest.getInstance(); try { System.out.println(gt.getEntry("java")); System.out.println(gt.getEntry("java")); Thread.sleep(2100); System.out.println(gt.getEntry("java")); System.out.println(gt.getEntry("java")); } catch (ExecutionException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } 

J’ai référé cet article exemple de cache de goyave