programacion memoria manejo internet chrome cache borrar java caching

manejo - Buscando caché en memoria Java simple



manejo de cache en java (9)

Dado que esta pregunta se realizó originalmente, la biblioteca de Guava de Google ahora incluye una memoria caché potente y flexible. Yo recomendaría usar esto.

Estoy buscando un simple caché en memoria de Java que tenga buena concurrencia (por lo que LinkedHashMap no es lo suficientemente bueno), y que se puede serializar en el disco periódicamente.

Una característica que necesito, pero que ha resultado difícil de encontrar, es una forma de "mirar" un objeto. Con esto me refiero a recuperar un objeto de la memoria caché sin hacer que la memoria caché se aferre al objeto más de lo que lo hubiera hecho de otra manera.

Actualización: un requisito adicional que omití mencionar es que necesito poder modificar los objetos en caché (que contienen matrices flotantes) en el lugar.

¿Alguien puede proporcionar alguna recomendación?


Otra opción para una memoria caché java en memoria es cache2k . El rendimiento en memoria es superior a EHCache y Google guava, consulte la página de pruebas de rendimiento de cache2k .

El patrón de uso es similar a otros cachés. Aquí hay un ejemplo:

Cache<String,String> cache = new Cache2kBuilder<String, String>() {} .expireAfterWrite(5, TimeUnit.MINUTES) // expire/refresh after 5 minutes .resilienceDuration(30, TimeUnit.SECONDS) // cope with at most 30 seconds // outage before propagating // exceptions .refreshAhead(true) // keep fresh when expiring .loader(new CacheLoader<String, String>() { @Override public String load(final String key) throws Exception { return ....; } }) .build(); String val = cache.peek("something"); cache.put("something", "hello"); val = cache.get("something");

Si tienes google guava como dependencia entonces probar guava cache, puede ser una buena alternativa.


Prueba esto:

import java.util.*; public class SimpleCacheManager { private static SimpleCacheManager instance; private static Object monitor = new Object(); private Map<String, Object> cache = Collections.synchronizedMap(new HashMap<String, Object>()); private SimpleCacheManager() { } public void put(String cacheKey, Object value) { cache.put(cacheKey, value); } public Object get(String cacheKey) { return cache.get(cacheKey); } public void clear(String cacheKey) { cache.put(cacheKey, null); } public void clear() { cache.clear(); } public static SimpleCacheManager getInstance() { if (instance == null) { synchronized (monitor) { if (instance == null) { instance = new SimpleCacheManager(); } } } return instance; } }



Pruebe Ehcache ? Le permite conectar sus propios algoritmos de caducidad de caché para que pueda controlar su funcionalidad de peek.

Puede serializar en disco, base de datos, a través de un clúster, etc.


Puedes usar imcache fácilmente. Un código de muestra está debajo.

void example(){ Cache<Integer,Integer> cache = CacheBuilder.heapCache(). cacheLoader(new CacheLoader<Integer, Integer>() { public Integer load(Integer key) { return null; } }).capacity(10000).build(); }



Si necesita algo simple, ¿esto encajaría?

Map<K, V> myCache = Collections.synchronizedMap(new WeakHashMap<K, V>());

No se guardará en el disco, pero dijiste que querías simple ...

Campo de golf:

(Como comentó Adam, sincronizar un mapa tiene un impacto en el rendimiento. No decir que la idea no tiene pelos, pero sería suficiente como una solución rápida y sucia).


Ehcache es una solución bastante buena para esto y tiene una forma de mirar ( getQuiet() es el método) tal que no actualiza la marca de tiempo inactiva. Internamente, Ehcache se implementa con un conjunto de mapas, algo así como ConcurrentHashMap, por lo que tiene tipos similares de ventajas de concurrencia.