API Lightweight Java Object cache [chiusa]


99

Domanda

Sto cercando un'API per la memorizzazione nella cache di oggetti in memoria Java. Qualche consiglio? Quali soluzioni hai utilizzato in passato?

attuale

In questo momento, sto solo usando una mappa:

Map cache = new HashMap<String, Object>();
cache.put("key", value);

Requisiti

Devo estendere la cache per includere funzionalità di base come:

  • Dimensione massima
  • Tempo di vivere

Tuttavia, non ho bisogno di funzionalità più sofisticate come:

  • Accesso da più processi (server di cache)
  • Persistenza (su disco)

Suggerimenti

Memorizzazione nella cache in memoria:

  • Guava CacheBuilder - sviluppo attivo. Vedi questa presentazione .
  • LRUMap - Configurazione tramite API. Nessun TTL. Non costruito appositamente per la memorizzazione nella cache.
  • whirlycache - configurazione XML. Mailing list. Ultimo aggiornamento 2006.
  • cache4j - configurazione XML. Documentazione in russo. Ultimo aggiornamento 2006.

Memorizzazione nella cache aziendale:

  • JCS - Proprietà config. Ampia documentazione.
  • Ehcache : configurazione XML. Ampia documentazione. Di gran lunga il più popolare secondo i risultati di Google.

3
È possibile modificare la sezione relativa al caching in memoria dei suggerimenti per includere Guava Cache? Stavo cercando un meccanismo di cache leggero proprio come te e ho trovato questa domanda, ma non ho trovato Guava perché è in fondo. Ora uso il pacchetto guava cache ed è INCREDIBILE.
andras

1
Fatto. Sorriso Molto contento che ti piaccia!
Kevin Bourrillion

Forse vuoi anche considerare di aggiungere il relativamente nuovo cache2k . Nella loro pagina dei benchmark si dice che ha prestazioni molto migliori di ehcache e Guava.
user3001

Prova @Cacheableda jcabi -aspects
yegor256

Risposte:


57

EHCache è molto carino. Puoi creare una cache in memoria. Controlla i loro esempi di codice per un esempio di creazione di una cache in memoria. Puoi specificare una dimensione massima e un tempo per vivere.

EHCache offre alcune funzionalità avanzate, ma se non sei interessato a usarle, non farlo. Ma è bello sapere che ci sono se le tue esigenze cambiano.

Ecco una cache in memoria. Creato in codice, senza file di configurazione.

CacheManager cacheManager = CacheManager.getInstance();
int oneDay = 24 * 60 * 60;
Cache memoryOnlyCache = new Cache("name", 200, false, false, oneDay, oneDay);
cacheManager.addCache(memoryOnlyCache);

Crea una cache che conterrà 200 elementi e ha un ttl di 24 ore.


2
EHCache si riferisce solo all'oggetto o serializza e quindi deserializza l'oggetto?
Phương Nguyễn

2
EHCache è una soluzione pesante? Stiamo esaminando le soluzioni di memorizzazione nella cache esistenti per implementare una cache API su Android.
Matthias

2
È troppo pesante per Android. Sto usando Kitty cache ed è così perfetto!
Felipe

@Stevet K, sono in ritardo per conoscere questa tecnologia Cache, ma immagino che getInstance () sia stato rimosso o modificato.
Menai Ala Eddine - Aladdin

46

Mi piace molto MapMakerquello fornito con Google Guava ( API )

Il JavaDoc ha un esempio piuttosto accurato che dimostra sia la sua facilità d'uso che la sua potenza:

ConcurrentMap<Key, Graph> graphs = new MapMaker()
   .concurrencyLevel(32)
   .softKeys()
   .weakValues()
   .expiration(30, TimeUnit.MINUTES)
   .makeComputingMap(
       new Function<Key, Graph>() {
         public Graph apply(Key key) {
           return createExpensiveGraph(key);
         }
       });

Inoltre, la versione 10.0 di Guava ha introdotto il com.google.common.cachepacchetto molto più ampio (c'è una bella voce wiki su come usarli ).



@mxttie: grazie, ho aggiunto il link, sentiti libero di suggerire una modifica per aggiunte come questa.
Joachim Sauer

10

Puoi anche controllare la mia piccola libreria cache chiamata KittyCache su:

https://github.com/treeder/kitty-cache

Esistono alcuni benchmark delle prestazioni rispetto a ehcache.

Viene utilizzato nel progetto SimpleJPA come cache di secondo livello.


1
Bello, ma se solo avesse TTL.
Rosdi Kasim

Grazie ! solo il codice che stavo digitando prima di pensare di controllare se qualcuno ha già
reso disponibile

@RosdiKasim ha effettivamente TTL alla chiamata put (), ad esempio: cache.put ("mykey", value, 500); 500 è TTL.
Travis Reeder

1
@TravisR Beh ..., allora non aveva TTL ..: p
Rosdi Kasim

Ahh, non avevo realizzato quanto tempo fa quel commento.
Travis Reeder

9

Puoi controllare LinkedHashMap per implementare una semplice cache senza jar di terze parti:

    Map <String, Foo> cache = new LinkedHashMap<String, Foo>(MAX_ENTRIES + 1, .75F, true) {

        public boolean removeEldestEntry(Map.Entry<String, Foo> eldest) {
            return size() > MAX_ENTRIES;
        }
    };

quindi puoi ottenere dalla cache come

    Foo foo = cache.get(key);
    if (foo == null && !cache.containsKey(key)) {
        try {
            FooDAO fooDAO = DAOFactory.getFooDAO(conn);
            foo = fooDAO.getFooByKey(key);
            cache.put(key, foo);
        } catch (SQLException sqle) {
            logger.error("[getFoo] SQL Exception when accessing Foo", sqle);
        }
    }

resto a sinistra come esercizio per il lettore :)


2
Non credo che questo metodo abbia capacità TTL. Tuttavia, sarebbe un buon inizio per lanciarne uno tuo.
Chase Seibert

Sì, lascerò la roba TTL come parte dell'esercizio del lettore: p - e ovviamente le librerie di terze parti saranno state testate molto più che rotolare le tue.
JeeBee


5

JCS è provato e vero. Anche se è leggero per quanto riguarda i meccanismi di cache, potresti scavare nel codice effettivo e imitare ciò che fanno con HashMap sotto le coperte esattamente ciò di cui hai bisogno e non di più. Sembra che tu abbia un'idea abbastanza chiara di quello che stai cercando.


Presumo che intendi dire che non è chiaro per quanto riguarda i meccanismi di cache? Tuttavia, sembra essere una delle soluzioni aziendali più popolari.
Chase Seibert

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.