Introduzione a Guava CacheLoader

1. Introduzione

In questo articolo, introdurremo Guava CacheLoader.

Prima di continuare a leggere, si consiglia di avere una conoscenza di base della classe LoadingCache . Questo perché CacheLoader funziona specificamente con esso.

Essenzialmente, il CacheLoader è una funzione utilizzata per calcolare un valore nel caso in cui non venga trovato in una Guava LoadingCache.

2. Utilizzo di un CacheLoader con una LoadingCache

Quando si verifica un errore nella cache con una LoadingCache, o la cache deve essere aggiornata, il CacheLoader verrà utilizzato per il calcolo dei valori. Ciò aiuta a incapsulare la nostra logica di memorizzazione nella cache in un unico punto, rendendo il nostro codice più coerente.

2.1. Dipendenza da Maven

Innanzitutto, aggiungiamo la nostra dipendenza Maven:

 com.google.guava guava 29.0-jre 

Puoi trovare l'ultima versione nel repository Maven.

2.2. Valori di calcolo e memorizzazione nella cache

Vediamo ora come istanziare un LoadingCache con un CacheLoader :

LoadingCache loadingCache = CacheBuilder.newBuilder() .build(new CacheLoader() { @Override public String load(final String s) throws Exception { return slowMethod(s); } });

Essenzialmente, il LoadingCache chiamerà il nostro CacheLoader inline ogni volta che deve calcolare un valore che non è stato memorizzato nella cache. Proviamo a contare quante volte il nostro slowMethod () viene chiamato quando recuperiamo qualcosa dalla cache più volte:

String value = loadingCache.get("key"); value = loadingCache.get("key"); assertThat(callCount).isEqualTo(1); assertThat(value).isEqualTo("expectedValue"); 

Come possiamo vedere, è stato chiamato solo una volta. La prima volta il valore non è stato memorizzato nella cache perché doveva ancora essere calcolato. La seconda volta, è stato memorizzato nella cache dalla chiamata precedente, quindi abbiamo potuto evitare l'overhead di chiamare nuovamente il nostro slowMethod () .

2.3. Aggiornamento della cache

Un altro problema comune con la memorizzazione nella cache è l'aggiornamento della cache. Sebbene l'aspetto più difficile sia sapere quando aggiornare la cache, un altro è sapere come.

Risolvere il come è semplice quando si utilizza CacheLoader. Il LoadingCache lo richiamerà semplicemente per ogni valore che deve essere aggiornato. Proviamolo con un test:

String value = loadingCache.get("key"); loadingCache.refresh("key"); assertThat(callCount).isEqualTo(2); assertThat(value).isEqualTo("key");

A differenza delle nostre successive chiamate a get (), refresh () forza il richiamo di CacheLoader , assicurandosi che i nostri valori siano aggiornati.

3. Conclusione

In questo articolo, abbiamo spiegato come un LoadingCache viene utilizzato da un CacheLoader per calcolare i valori sui mancati riscontri nella cache e anche sugli aggiornamenti della cache. Vale anche la pena dare un'occhiata a questo articolo più approfondito su Guava Caching.

L'implementazione di questi esempi può essere trovata su GitHub. Questo è un progetto Maven, quindi dovrebbe essere facile da eseguire così com'è.