Tengo una aplicación web java que hace uso de un servicio web de terceros. Llamar al servicio web crea latencia, que es importante evitar siempre que sea posible. Además, mi aplicación solo puede realizar una determinada cantidad de llamadas al servicio web por día, por lo que es mejor no realizar una llamada al servicio web a menos que sea absolutamente necesario.caché clave/valor similar a un memcached que usa memoria RAM y disco
Mi solución actual es almacenar en caché los resultados del servicio web en Memcached, y esto funciona bien. Básicamente, estamos utilizando RAM para almacenar en caché los resultados del servicio web.
Sin embargo, nos gustaría llevar esto al siguiente nivel. También tenemos espacio en disco que nos gustaría utilizar como memoria caché de disco para almacenar en caché los resultados del servicio web. Me gustaría un sistema donde primero verifiquemos el caché de RAM (que podría ser Memcached, pero no tiene que ser así). Cuando ocurre una falla en la memoria caché de RAM, nos volvemos a consultar la caché de disco. Y cuando ocurre una falla en la memoria caché de disco, volvemos a llamar al servicio web. Cada vez que recuperamos nuevos resultados del servicio web, entonces actualizamos tanto el caché de RAM como el caché de disco.
Una posibilidad sería utilizar una base de datos SQL como la parte del sistema que utiliza el disco para el almacenamiento. Pero esto parece menos que ideal. Las bases de datos tienden a necesitar mucho cuidado de niños. A menudo implican archivos (ya sea el propio db o el registro de transacciones) que crecen sin límite, por lo que debe administrar lo que sucede cuando estos archivos en crecimiento comienzan a causar que el sistema de archivos se quede sin espacio.
Lo que quiero en su lugar para la parte del sistema basada en disco es algo donde puedo decir cuánto espacio de disco usar, y garantizará que nunca utilizará más que eso. Y cuando se quede sin espacio, comenzará a tirar automáticamente los pares clave-valor utilizados menos recientemente. Definitivamente no necesito ACID, por lo que no debería haber registros de transacciones.
lo que estoy buscando, ya sea para: 1) un sistema de almacenamiento de claves-valor basado en disco que puede actuar como la "conmutación por error" cuando Memcached tiene un error de caché O 2) un único sistema que reemplazaría Memcached y proporcionar tanto el caché de RAM como el caché de disco.
Otras cualidades importantes que quiero: 1) Al igual que Memcached, quiero un sistema de almacenamiento en caché que no requiere niñera. 2) Al igual que Memcached, quiero que la memoria caché participe en varios servidores, con cada objeto viviendo en exactamente un servidor. 3) Al igual que Memcached, quiero algo que sea bastante fácil de conectar y usar. No quiero tener que escribir una tonelada de código para que esto funcione.
Otros sistemas que ya he visto: 1) Creo que Redis no encaja aquí, ya que su caché de disco es solo un espejo de lo que hay en la RAM. Quiero que la caché de RAM sea un pequeño subconjunto de la caché de disco. 2) EhCache tiene una "tienda de discos persistente que almacena datos entre reinicios de máquina virtual", pero eso no es muy similar a lo que he descrito anteriormente.
Apache JCS (Java Caching System) parece que podría ser una buena opción, por lo que me encantaría escuchar sus opiniones de aquellos que lo han usado.
Gracias. Esta puede ser la solución que estoy buscando. Ahora veo que puede configurar una DiskStore y especificar el parámetro maxElementsOnDisk. –