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é?
Pour le moment, j'utilise simplement une carte:
Map cache = new HashMap<String, Object>();
cache.put("key", value);
J'ai besoin d'étendre le cache pour inclure des fonctionnalités de base comme:
Cependant, je n'ai pas besoin de fonctionnalités plus sophistiquées comme:
Mise en cache en mémoire:
Mise en cache d'entreprise:
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.
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 .
MapMaker de Goyave a été remplacé par leur classe CacheBuilder .
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.
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 :)
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.
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.