Estoy buscando un caché en memoria de Java simple que tenga buena concurrencia (por lo que LinkedHashMap no es lo suficientemente bueno) y que se pueda 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 caché sin hacer que la caché se aferre al objeto más tiempo del que tendría de otra manera.
Actualización: un requisito adicional que olvidé mencionar es que necesito poder modificar los objetos en caché (contienen matrices flotantes) en su lugar.
¿Alguien puede dar alguna recomendación?
Respuestas:
Dado que esta pregunta se hizo originalmente, la biblioteca Guava de Google ahora incluye un caché potente y flexible. Recomendaría usar esto.
fuente
Ehcache es una solución bastante buena para esto y tiene una forma de echar un vistazo ( getQuiet () es el método) de manera 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 beneficios de concurrencia.
fuente
Si necesita algo simple, ¿esto se ajusta a la factura?
No se guardará en el disco, pero dijiste que querías simple ...
Enlaces:
(Como comentó Adam, sincronizar un mapa tiene un impacto en el rendimiento. No digo que la idea no tenga pelos en ella, pero sería suficiente como una solución rápida y sucia).
fuente
ConcurrentHashMap<WeakReference<T>>
. docs.oracle.com/javase/7/docs/api/java/lang/ref/…Otra opción para un caché de Java en memoria es cache2k . El rendimiento en memoria es superior al de 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:
Si tiene google guava como dependencia, probar el caché de guayaba puede ser una buena alternativa.
fuente
Puedes usar imcache fácilmente . A continuación se muestra un código de muestra.
fuente
Prueba esto:
fuente
public static SimpleCacheManager getInstance() {
debería ser depublic synchronized static SimpleCacheManager getInstance() {
otra maneraif (instance == null) {
no es seguro para subprocesos. En cuyo caso, puede eliminar el objeto del monitor todos juntos, ya que la sincronización tiene lugar para todas las llamadas getInstance (), consulte: javaworld.com/article/2073352/core-java/…Prueba
@Cacheable
desde jcabi-aspectos . Con una sola anotación, hace que todo el resultado del método se pueda almacenar en caché en la memoria:Además, lea este artículo: http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html
fuente
¿Qué tal esto? Https://commons.apache.org/proper/commons-jcs/ (actualizado a la nueva dirección, ya que JCS ahora está en Apache Commons)
fuente
¿Prueba Ehcache ? Le permite conectar sus propios algoritmos de caducidad de almacenamiento en caché para que pueda controlar su funcionalidad de inspección.
Puede serializar en disco, base de datos, en un clúster, etc.
fuente