Leichte Java Object Cache API [geschlossen]


99

Frage

Ich suche nach einer Java In-Memory-Objekt-Caching-API. Irgendwelche Empfehlungen? Welche Lösungen haben Sie in der Vergangenheit verwendet?

Aktuell

Im Moment verwende ich nur eine Karte:

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

Bedarf

Ich muss den Cache um grundlegende Funktionen wie Folgendes erweitern:

  • maximale Größe
  • Zeit zu leben

Ich brauche jedoch keine anspruchsvolleren Funktionen wie:

  • Zugriff von mehreren Prozessen (Caching-Server)
  • Persistenz (auf Festplatte)

Vorschläge

In-Memory-Caching:

  • Guava CacheBuilder - aktive Entwicklung. Siehe diese Präsentation .
  • LRUMap - Konfiguration über API. Keine TTL. Nicht für das Caching gedacht.
  • whirlycache - XML-Konfiguration Mailingliste. Letzte Aktualisierung 2006.
  • cache4j - XML-Konfiguration Dokumentation in russischer Sprache. Letzte Aktualisierung 2006.

Enterprise-Caching:

  • JCS - Eigenschaften config. Umfangreiche Dokumentation.
  • Ehcache - XML-Konfiguration Umfangreiche Dokumentation. Bei weitem am beliebtesten laut Google-Hits.

3
Können Sie den Abschnitt "In-Memory-Caching" für Vorschläge so bearbeiten, dass er den Guava-Cache enthält? Ich suchte nach einem leichten Caching-Mechanismus wie Sie und fand diese Frage, fand aber Guava nicht, weil es weit unten ist. Jetzt benutze ich das Guaven-Cache-Paket und es ist ERSTAUNLICH.
Andras

1
Getan. :-) Sehr froh, dass es dir gefällt!
Kevin Bourrillion

Vielleicht möchten Sie auch das relativ neue cache2k hinzufügen . Auf ihrer Benchmark-Seite heißt es, dass es eine viel bessere Leistung als ehcache und Guava hat.
user3001

Antworten:


57

EHCache ist sehr nett. Sie können einen In-Memory-Cache erstellen. In den Codebeispielen finden Sie ein Beispiel für die Erstellung eines In-Memory-Cache. Sie können eine maximale Größe und eine Lebenszeit angeben.

EHCache bietet einige erweiterte Funktionen, aber wenn Sie nicht daran interessiert sind, diese zu verwenden, tun Sie dies nicht. Aber es ist schön zu wissen, dass sie da sind, wenn sich Ihre Anforderungen jemals ändern.

Hier ist ein In-Memory-Cache. Erstellt im Code ohne Konfigurationsdateien.

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

Erstellt einen Cache mit 200 Elementen und einer Laufzeit von 24 Stunden.


2
Bezieht sich EHCache nur auf das Objekt oder serialisiert es das Objekt und deserialisiert es stattdessen?
Phương Nguyễn

2
Ist EHCache eine Schwergewichtslösung? Wir untersuchen vorhandene Caching-Lösungen, um einen API-Cache unter Android zu implementieren.
Matthias

2
Es ist zu schwer für Android. Ich benutze Kitty Cache und es ist so perfekt!
Felipe

@Stevet K, ich bin spät dran, diese Cache-Technologie zu kennen, aber ich denke, getInstance () wurde entfernt oder geändert.
Menai Ala Eddine - Aladdin

46

Ich mag das MapMaker, was mit Google Guava ( API ) geliefert wird.

Der JavaDoc hat ein hübsches Beispiel, das sowohl seine Benutzerfreundlichkeit als auch seine Leistungsfähigkeit demonstriert:

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

Darüber hinaus wurde in Version 10.0 von Guava das viel umfangreichere com.google.common.cachePaket eingeführt (es gibt einen schönen Wiki-Eintrag zu deren Verwendung ).



@mxttie: Danke, ich habe den Link hinzugefügt. Sie können gerne eine Bearbeitung für solche Ergänzungen vorschlagen.
Joachim Sauer

10

Sie können auch meine kleine Cache-Bibliothek namens KittyCache unter folgender Adresse überprüfen:

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

Es gibt einige Leistungsbenchmarks gegenüber ehcache.

Es wird im SimpleJPA- Projekt als Cache der zweiten Ebene verwendet.


1
Schön, aber wenn es nur TTL hat.
Rosdi Kasim

Vielen Dank ! Nur der Code, den ich eingegeben habe, bevor ich darüber nachdachte zu überprüfen, ob jemand bereits Open-Source-
Produkte

@RosdiKasim hat TTL tatsächlich beim Aufruf von put (), zB: cache.put ("mykey", value, 500); 500 ist TTL.
Travis Reeder

1
@TravisR Nun ..., es hatte damals keine TTL ..: p
Rosdi Kasim

Ahh, ich wusste nicht, wie lange dieser Kommentar her ist.
Travis Reeder

9

Sie können LinkedHashMap auschecken, um einen einfachen Cache ohne Jars von Drittanbietern zu implementieren:

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

dann kann man aus dem cache gerne abrufen

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

Rest links als Übung für den Leser :)


2
Ich glaube nicht, dass diese Methode TTL-Kapazität hat. Es wäre jedoch ein guter Anfang, um Ihre eigenen zu rollen.
Chase Seibert

Ja, ich werde das TTL-Zeug als Teil der Leserübung belassen: p - und natürlich wurden die Bibliotheken von Drittanbietern weit mehr getestet als das Rollen Ihrer eigenen.
JeeBee


5

JCS hat sich bewährt. Auch wenn es in Bezug auf die Caching-Mechanismen leicht ist, können Sie sich in den eigentlichen Code vertiefen und nachahmen, was sie mit HashMap unter der Decke tun, um genau das zu erreichen, was Sie brauchen, und nicht mehr. Sie scheinen eine ziemlich gute Vorstellung davon zu haben, wonach Sie suchen.


Ich nehme an, Sie meinen, es ist nicht leicht, was die Caching-Mechanismen angeht? Es scheint jedoch eine der beliebtesten Unternehmenslösungen zu sein.
Chase Seibert

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.