studio programacion móviles manejo library desarrollo curso cache aplicaciones java caching

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:

  • JCS - Configuración de propiedades Amplia documentación.
  • EHCache - configuración XML. Amplia documentación. De lejos, el más popular según Google hits.


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.