Leggero Java Object cache API

Domanda

Sto cercando un Java in memoria cache di oggetti di API. Qualche raccomandazione? Quali sono le soluzioni che hai usato in passato?

Corrente

Proprio ora, sto solo usando una Mappa:

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

Requisiti

Ho bisogno di estendere la cache per includere caratteristiche di base, come:

  • Max dimensione
  • Tempo per vivere

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

  • L’accesso da più processi (server di caching)
  • Persistenza (a disco)

Suggerimenti

In Memoria cache:

  • Guava CacheBuilder – fase di sviluppo attivo. Vedere questo presentazione.
  • LRUMap – Config tramite API. Non TTL. Non appositamente costruito per la memorizzazione nella cache.
  • whirlycache – Configurazione XML. Mailing list. Ultimo aggiornamento 2006.
  • cache4j – Configurazione XML. Documentazione in russo. Ultimo aggiornamento 2006.

Enterprise cache:

  • JCS – Proprietà config. Ampia documentazione.
  • Ehcache – Configurazione XML. Ampia documentazione. Di gran lunga il più popolare secondo Google colpisce.
  • Si possono modificare i Suggerimenti In Memoria cache sezione per includere Guava Cache? Ero alla ricerca di un leggero meccanismo di caching come te, e trovato questa domanda, ma non ho trovato di Guava, perché il modo in giù. Ora uso il guava cache pacchetto, ed è INCREDIBILE.
  • Fatto. 🙂 Sono molto contento che ti piaccia!
  • Forse anche voi volete prendere in considerazione di aggiungere il relativamente nuovo cache2k. Su di loro parametri non è detto che si ha un rendimento migliore di quanto ehcache e Guava.
  • Provare @Cacheable da jcabi-aspetti: yegor256.com/2014/08/03/cacheable-java-annotation.html

 

7 Replies
  1. 55

    EHCache è molto bello. È possibile creare una cache di memoria. Check out loro esempi di codice per un esempio di creazione di una memoria cache. È possibile specificare una dimensione massima e un tempo per vivere.

    EHCache offre alcune funzionalità avanzate, ma se non siete interessati nel loro utilizzo – non. Ma è bello sapere che esistono, se avete bisogno di cambiare sempre.

    Qui è una memoria cache. Creata nel codice, con nessun 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 con un ttl di 24 ore.

    • Non EHCache basta fare riferimento all’oggetto o serializzare e quindi deserializzare l’oggetto, invece?
    • È EHCache una soluzione pesante? Stiamo cercando in esistenti soluzioni di memorizzazione nella cache per implementare una API cache su Android.
    • È troppo pesante per Android. Sto usando Kitty cache ed è così perfetto!
    • K,sono in ritardo per conoscere questa tecnologia di Cache ,ma credo che getInstance() è stato rimosso o modificato.
  2. 43

    Mi piace molto il Cartografo che viene fornito con Google Guava (API)

    JavaDoc è un bello esempio che dimostra sia la sua facilità di utilizzo e 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 introdotto molto più ampio com.google.comune.cache pacchetto.

    • oh uomo, che è impressionante.
  3. 9

    È anche possibile controllare il mio piccolo cache libreria chiamata KittyCache a:

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

    Ci sono alcuni parametri di rendimento vs ehcache.

    Usato in SimpleJPA progetto come un secondo livello di cache.

    • Bella, ma se solo si ha il TTL.
    • Molto buona! Grazie mille!
    • Grazie ! solo il codice che stavo scrivendo prima ho pensato di controllare se qualcuno ha già aperto provenienza qualcosa 🙂
    • non TTL effettivamente sul put() chiamata, ad esempio: cache.put(“mykey”, valore 500); 500 è di tipo TTL.
    • Beh…, non TTL allora.. :p
    • Ahh, non si è accorto di come, tempo fa, che commento è stato.

  4. 8

    È possibile controllare LinkedHashMap implementare un semplice cache senza che terze parti vasetti:

        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;
            }
        };

    allora si può 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 lasciato come esercizio per il lettore 🙂

    • Non credo che questo metodo ha il TTL capacità. Sarebbe un buon inizio verso il rotolare il vostro proprio, però.
    • Sì, lascio il TTL roba come parte del lettore di esercizio :p – e, naturalmente, il terzo libs sono stati testati molto di più di rotolare il vostro proprio.
  5. 5

    JCS è vero e provato. Anche se c’è luce fino meccanismi di caching, allora si potrebbe scavare nel codice effettivo e imitare quello che fanno con HashMap sotto le coperte esattamente che cosa avete bisogno e non di più. Sembra che tu abbia una buona idea di ciò che si sta cercando.

    • Presumo che significa non luce di quanto meccanismi di caching andare? Sembra essere uno dei più popolari soluzioni enterprise, però.

Lascia un commento