venerdì 16 dicembre 2011

Google Cache Guava

Questo post è una continuazione della mia serie su Google Guava, questa volta copre Cache Guava. Cache guava offre maggiore flessibilità e potenza rispetto sia una HashMap o ConcurrentHashMap, ma non è pesante come usare EHCache o Memcached (o robusta per quella materia, come Cache Guava opera esclusivamente in memoria). L'interfaccia della cache ha metodi che ci si aspetta di vedere come 'prendere', e 'invalida'.Un metodo che non troverete è 'put', perché Cache Guava è 'auto-popolare', valori che non sono presenti quando richiesti sono recuperati o calcolati, quindi memorizzate. Ciò significa che una chiamata 'capisci' non tornerà mai più nulla. In tutta onestà, l'affermazione precedente non è accurato al 100%. C'è 'ASMAP' un altro metodo che espone le voci nella cache come una mappa thread-safe. Usando 'ASMAP' si tradurrà in non aventi una delle operazioni di carico di auto eseguite, chiamate così per 'catturare' ritorna null se il valore non è presente (cosa divertente è che?). Anche se questo è un post di cache Guava, sto andando a trascorrere la maggior parte del tempo a parlare di CacheLoader e CacheBuilder. CacheLoader specifica come caricare i valori, e CacheBuilder viene utilizzato per impostare le funzioni desiderate e di fatto costruire la cache.

CacheLoader

CacheLoader è una classe astratta che specifica come calcolare o caricare i valori, se non presente. Ci sono due modi per creare un'istanza di un CacheLoader:
  1. Estendere la classe <K,V> CacheLoader
  2. Utilizzare il metodo factory statici CacheLoader.from
Se si estende CacheLoader è necessario ignorare il carico V (chiave K) metodo, istruzioni su come generare il valore per una data chiave. Utilizzando il metodo statico CacheLoader.from si crea un CacheLoader sia fornendo una funzione o interfaccia Fornitore. Quando si fornisce un oggetto funzione, la funzione viene applicata alla chiave per calcolare o recuperare i risultati. Utilizzando un'interfaccia Fornitore il valore ottenuto è indipendente dalla chiave.

CacheBuilder

Il CacheBuilder viene utilizzato per costruire istanze cache. Utilizza lo stile fluente della costruzione e ti dà la possibilità di impostare le seguenti proprietà nella cache:
  • Cache limite Dimensione (traslochi utilizzare un algoritmo LRU)
  • Chiavi di avvolgimento in WeakReferences (riferimenti Forte usato di default per le chiavi)
  • Valori di avvolgimento in entrambi WeakReferences o SoftReferences (riferimenti forti utilizzata per impostazione predefinita)
  • Tempo per scadere interi dopo l'ultimo accesso
  • Tempo base di scadenza delle iscrizioni dopo essere stato scritto o aggiornato
  • L'impostazione di un RemovalListener che possono ricevere gli eventi una volta una voce viene rimosso dalla cache
  • Livello di concorrenza della cache (il default è 4)
L'opzione livello di concorrenza è usata per dividere la tavola internamente in modo tale che gli aggiornamenti possono avvenire senza contesa. L'ideale sarebbe stato il numero massimo di thread che potrebbero accedere alla cache in una sola volta. Ecco un esempio di scenario di utilizzo possibile della cache Guava.
01.pubblico classe PersonSearchServiceImpl implementa Ordine di ricerca <Lista <Person>> {
02. 
03.pubblico PersonSearchServiceImpl (SampleLuceneSearcher luceneSearcher, SampleDBService dbService) {
04.questo luceneSearcher = luceneSearcher.;
05.questo dbService dbService =.;
06.buildCache ();
07.}
08. 
09.@ Override
10.pubblici di ricerca <Person> List (String query) throws Exception {
11.ritorno cache.get (query);
12.}
13. 
14.privata vuoto buildCache () {
15.cache = CacheBuilder.newBuilder (). expireAfterWrite ( 10 , TimeUnit.MINUTES)
16.. MaximumSize ( 1000 )
17.. costruire ( nuovo CacheLoader <String, List <Person>> () {
18.@ Override
19.pubblico carico <Person> List (String queryKey) throws Exception {
. 20Lista <String> id = luceneSearcher.search (queryKey);
21.ritorno dbService.getPersonsById (id);
22.}
23.});
24.}
25.}
In questo esempio, io pongo la voci di cache per scadere dopo 10 minuti di essere scritti o aggiornati nella cache, con un importo massimo di 1.000 entires. Si noti l'utilizzo di CacheLoader sulla linea 15.

RemovalListener

Il RemovalListener riceverà la notifica di un elemento viene rimosso dalla cache. Queste notifiche possono essere da invalidazioni manuale o da un automatico a causa della scadenza di tempo o di Garbage Collection. I parametri RemovalListener <K,V> può essere impostata per ascoltare tipo specifico. Per ricevere le notifiche per qualsiasi chiave o un valore li impostato per utilizzare degli oggetti. Va notato qui che un RemovalListener riceverà un oggetto <K,V> RemovalNotification che implementa l'interfaccia Map.Entry. La chiave o il valore potrebbe essere null se uno è già stato garbage collection. Anche l'oggetto chiave e il valore sarà riferimenti forti, indipendentemente dal tipo di riferimenti utilizzati dalle cache.

CacheStats

C'è anche una classe molto utile CacheStats che possono essere recuperate tramite una chiamata a Cache.stats ().L'oggetto CacheStats può dare 
comprensione l'efficacia e le prestazioni della cache, fornendo statistiche come:
  • colpito contare
  • perdere contare
  • timme carico totale
  • richieste totali
CacheStats fornisce molti altri capi in aggiunta a quelli sopra elencati.

Conclusione

La cache di Guava presenta alcune funzionalità molto interessanti. La decisione di utilizzare una cache Guava tratta veramente basso per il compromesso tra la disponibilità di memoria / utilizzo rispetto a un aumento delle prestazioni. Ho aggiunto uno unit test CacheTest dimostrare la usi discusso qui. Come sempre puntuale commenti e suggerimenti sono i benvenuti. Grazie per il vostro tempo.

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.