¿Alguno de ustedes sabe de un Java Map o un almacén de datos estándar similar que purga automáticamente las entradas después de un tiempo de espera determinado? Esto significa envejecimiento, donde las entradas caducadas antiguas "caducan" automáticamente.
¿Preferiblemente en una biblioteca de código abierto que sea accesible a través de Maven?
Sé de maneras de implementar la funcionalidad yo mismo y lo he hecho varias veces en el pasado, por lo que no estoy pidiendo consejos al respecto, sino sugerencias para una buena implementación de referencia.
Las soluciones basadas en WeakReference como WeakHashMap no son una opción, porque es probable que mis claves sean cadenas no internadas y quiero un tiempo de espera configurable que no dependa del recolector de basura.
Ehcache también es una opción en la que no me gustaría confiar porque necesita archivos de configuración externos. Estoy buscando una solución de solo código.
fuente
Respuestas:
Si. Google Collections, o Guava como se llama ahora, tiene algo llamado MapMaker que puede hacer exactamente eso.
Actualizar:
A partir de la guayaba 10.0 (lanzada el 28 de septiembre de 2011), muchos de estos métodos de MapMaker han quedado en desuso a favor del nuevo CacheBuilder :
fuente
weakKeys()
implica que las claves se comparan utilizando la semántica ==, noequals()
. Perdí 30 minutos descubriendo por qué mi caché con cadenas no funcionaba :)weakKeys()
es importante.weakKeys()
No se requiere el 90% del tiempo.Esta es una implementación de muestra que hice para el mismo requisito y la concurrencia funciona bien. Puede ser útil para alguien.
Enlace Git Repo (con implementación de escucha)
https://github.com/vivekjustthink/WeakConcurrentHashMap
¡¡Salud!!
fuente
cleanMap()
mitad del tiempo especificado?Puede probar mi implementación de un mapa hash que caduca por sí mismo. Esta implementación no utiliza subprocesos para eliminar entradas caducadas, sino que utiliza DelayQueue que se limpia automáticamente en cada operación.
fuente
Apache Commons tiene un decorador para que el Mapa expire las entradas: PassiveExpiringMap Es más simple que los cachés de Guava.
PD: ten cuidado, no está sincronizado.
fuente
Parece que ehcache es excesivo para lo que desea, sin embargo, tenga en cuenta que no necesita archivos de configuración externos.
En general, es una buena idea mover la configuración a un archivo de configuración declarativo (por lo que no es necesario volver a compilar cuando una nueva instalación requiere un tiempo de vencimiento diferente), pero no es necesario, aún puede configurarlo mediante programación. http://www.ehcache.org/documentation/user-guide/configuration
fuente
Las colecciones de Google (guayaba) tienen el MapMaker en el que puede establecer un límite de tiempo (para la caducidad) y puede usar referencias suaves o débiles cuando elija utilizando un método de fábrica para crear instancias de su elección.
fuente
puedes probar Expiring Map http://www.java2s.com/Code/Java/Collections-Data-Structure/ExpiringMap.htm una clase del Proyecto MINA de Apache
fuente
Si alguien necesita algo simple, lo siguiente es un conjunto simple de expiración de clave. Podría convertirse fácilmente en un mapa.
fuente
System.nanoTime()
para calcular las diferencias de tiempo, ya que System.currentTimeMillis () no es coherente, ya que depende de la hora del sistema y podría no ser continuo.Por lo general, un caché debe mantener los objetos en algún momento y exponerlos algún tiempo después. El momento adecuado para sostener un objeto depende del caso de uso. Quería que esto fuera simple, sin hilos ni programadores. Este enfoque funciona para mí. A diferencia de
SoftReference
s, se garantiza que los objetos estarán disponibles durante un tiempo mínimo. Sin embargo, no se quedan en la memoria hasta que el sol se convierta en un gigante rojo .Como ejemplo de uso, piense en un sistema de respuesta lenta que será capaz de verificar si una solicitud se ha realizado recientemente y, en ese caso, no realizar la acción solicitada dos veces, incluso si un usuario agitado presiona el botón varias veces. Pero, si se solicita la misma acción algún tiempo después, se realizará nuevamente.
fuente
La caché de guayaba es fácil de implementar. Podemos expirar la clave en base al tiempo usando la caché de guayaba. He leído completamente la publicación y a continuación da la clave de mi estudio.
Referencia: ejemplo de caché de guayaba
fuente