web-dev-qa-db-fra.com

Léger Java API de cache d'objets

Question

Je recherche un Java API de mise en cache d'objets en mémoire. Des recommandations? Quelles solutions avez-vous utilisées dans le passé?

Courant

Pour le moment, j'utilise simplement une carte:

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

Exigences

J'ai besoin d'étendre le cache pour inclure des fonctionnalités de base comme:

  • Taille max
  • Temps de vivre

Cependant, je n'ai pas besoin de fonctionnalités plus sophistiquées comme:

  • Accès à partir de plusieurs processus (serveur de mise en cache)
  • Persistance (sur disque)

Suggestions

Mise en cache en mémoire:

  • Guava CacheBuilder - développement actif. Voir ceci présentation .
  • LRUMap - Config via l'API. Pas de TTL. Pas spécialement conçu pour la mise en cache.
  • whirlycache - Configuration XML. Liste de diffusion. Dernière mise à jour 2006.
  • cache4j - Configuration XML. Documentation en russe. Dernière mise à jour 2006.

Mise en cache d'entreprise:

  • JCS - Configuration des propriétés. Documentation complète.
  • Ehcache - Configuration XML. Documentation complète. De loin le plus populaire selon les hits de Google.
96
Chase Seibert

EHCache est très agréable. Vous pouvez créer un cache en mémoire. Consultez leur exemples de code pour un exemple de création d'un cache en mémoire. Vous pouvez spécifier une taille maximale et une durée de vie.

EHCache offre des fonctionnalités avancées, mais si vous n'êtes pas intéressé à les utiliser - ne le faites pas. Mais c'est bien de savoir qu'ils sont là si vos besoins changent.

Voici un cache en mémoire. Créé en code, sans fichier de configuration.

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

Crée un cache qui contiendra 200 éléments et a un ttl de 24 heures.

55
Steve K

J'aime vraiment le MapMaker qui vient avec Google Guava ( API )

Le JavaDoc a un exemple assez soigné qui démontre à la fois sa facilité d'utilisation et sa puissance:

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

De plus, la version 10.0 de Guava a introduit la version beaucoup plus complète com.google.common.cache package .

43
Joachim Sauer

MapMaker de Goyave a été remplacé par leur classe CacheBuilder .

9
Bohemian

Vous pouvez également consulter ma petite bibliothèque de cache appelée KittyCache à:

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

Il existe des tests de performances par rapport à ehcache.

Il est utilisé dans le projet SimpleJPA comme cache de deuxième niveau.

9
Travis Reeder

Vous pouvez consulter LinkedHashMap pour implémenter un cache simple sans fichiers tiers:

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

alors vous pouvez obtenir du cache comme

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

reste à gauche comme exercice pour le lecteur :)

8
JeeBee

JCS a fait ses preuves. Même s'il est léger en ce qui concerne les mécanismes de mise en cache, vous pouvez creuser dans le code réel et imiter ce qu'il fait avec HashMap sous les couvertures pour exactement ce dont vous avez besoin et pas plus. Vous semblez avoir une assez bonne idée de ce que vous recherchez.

5
Ichorus

memcached a un client pour Java. http://www.danga.com/memcached/ Nécessite un processus distinct pour être un serveur de mise en cache, mais une chose puissante.

3
Zorkus