programacion - API ligera de caché de objetos Java
manejo de cache en java (7)
Pregunta
Estoy buscando una API de caché de objetos en memoria de Java. ¿Alguna recomendación? ¿Qué soluciones has usado en el pasado?
Corriente
En este momento, solo estoy usando un Mapa:
Map cache = new HashMap<String, Object>();
cache.put("key", value);
Requisitos
Necesito extender el caché para incluir funciones básicas como:
- tamaño máximo
- Tiempo para vivir
Sin embargo, no necesito funciones más sofisticadas como:
- Acceso desde múltiples procesos (servidor de almacenamiento en caché)
- Persistencia (al disco)
Sugerencias
Almacenamiento en memoria caché en memoria:
- Guava CacheBuilder - desarrollo activo. Vea esta presentation .
- LRUMap - Config vía API. Sin TTL. No construido para el almacenamiento en caché.
- whirlycache - Configuración XML. Lista de correo. Última actualización 2006.
- cache4j - Configuración XML. Documentación en ruso Última actualización 2006.
Almacenamiento en caché de la empresa:
El MapMaker de Guava ha sido reemplazado por su clase CacheBuilder .
Me gusta mucho el MapMaker
que viene con Google Guava ( API )
El JavaDoc tiene un bonito ejemplo que demuestra tanto su facilidad de uso como su poder:
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);
}
});
Además, la versión 10.0 de Guava introdujo el paquete com.google.common.cache
mucho más extenso.
Puede consultar LinkedHashMap para implementar un caché simple sin tarros de terceros:
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;
}
};
entonces puedes obtener de la caché como
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 dejado como ejercicio para el lector :)
También puede consultar mi pequeña biblioteca de caché llamada KittyCache en:
https://github.com/treeder/kitty-cache
Hay algunos puntos de referencia de rendimiento vs ehcache.
Se usa en el proyecto SimpleJPA como un caché de segundo nivel.
memcached tiene un cliente para Java. http://www.danga.com/memcached/ Requiere un proceso separado para ser un servidor de almacenamiento en caché, pero algo poderoso.
EHCache es muy agradable. Puede crear un caché en la memoria. Consulte sus ejemplos de código para ver un ejemplo de creación de memoria caché. Puede especificar un tamaño máximo y un tiempo para vivir.
EHCache ofrece algunas características avanzadas, pero si no está interesado en usarlas, no lo haga. Pero es bueno saber que están ahí si cambian sus requisitos.
Aquí hay un caché de memoria. Creado en código, sin archivos de configuración.
CacheManager cacheManager = CacheManager.getInstance();
int oneDay = 24 * 60 * 60;
Cache memoryOnlyCache = new Cache("name", 200, false, false, oneDay, oneDay);
cacheManager.addCache(memoryOnlyCache);
Crea un caché que contendrá 200 elementos y tiene un ttl de 24 horas.
JCS es probado y verdadero. A pesar de que es ligero en lo que respecta a los mecanismos de almacenamiento en caché, puede profundizar en el código real e imitar lo que hacen con HashMap bajo las coberturas para exactamente lo que necesita y nada más. Parece que tienes una idea bastante buena de lo que estás buscando.