java - manejo - Es posible configurar el comportamiento de la memoria caché de Guava(u otra biblioteca): si es hora de volver a cargar, devolver la entrada anterior, volver a cargar en segundo plano(ver especificaciones)
borrar memoria cache windows 10 (1)
En cache2k implementé exactamente el comportamiento que describiste arriba. A continuación, le mostramos cómo crear un caché con estas características:
CacheBuilder.newCache(Key.class, Value.class)
.name("myCache")
.source(new YourSourceImplementation())
.backgroundRefresh(true)
.suppressExceptions(true)
.maxSize(7777) // maximum entries in the cache
.expiryDuration(60, TimeUnit.SECONDS)
.exceptionExpiryDuration(15, TimeUnit.SECONDS)
.build();
La exipryDuration
es la duración en que el valor se considera válido después de que se insertó o modificó la guerra. La configuración separada para exceptionExpiryDuration
es el tiempo hasta que se intenta la próxima actualización después de que ocurre una excepción.
Si se produce una excepción, pero no hay una entrada válida, la excepción se almacena en caché y se vuelve a lanzar para la exceptionExpiryDuration
time.
También puede calcular dinámicamente la duración de caducidad, por ejemplo, en función del tipo de excepción. Más información se encuentra en la entrada del blog Acerca de las excepciones de almacenamiento en caché
Con backgroundRefresh
una entrada se actualiza después de que haya expirado. Cuando no ocurre el acceso después de una actualización dentro del tiempo de caducidad, la entrada no se actualizará más y luego será desalojada.
Desafortunadamente, estoy realmente atrasado en documentar todas estas funciones útiles correctamente. Si tiene más preguntas, puede usar la etiqueta cache2k
. Si le gustan algunas mejoras, abra un problema en GitHub.
El código funciona bien en nuestras aplicaciones de producción desde hace aproximadamente un año. En realidad, suppressExceptions
es siempre el predeterminado. Ayuda muy bien, por ejemplo, si hay una corta interrupción de la red.
Por cierto, mientras tanto, incluyo esta semántica bajo el término resiliencia de memoria caché .
Me gustaría tener un caché que funcione así:
- A. Si la solicitud no está almacenada en caché: carga y devuelve resultados.
- B. Si la solicitud se almacena en caché, no ha caducado: devuelve resultados.
- C. Si la solicitud se almacena en caché, ha expirado: comience a volver a cargar los resultados, devuelva los resultados anteriores de inmediato.
- D. Si la solicitud está en caché, ha expirado, la recarga ya está en marcha: devuelva los resultados anteriores de inmediato.
- E. Si la recarga falla (Excepción): continúa devolviendo los resultados de carga exitosos anteriores a las solicitudes.
(Después de una recarga fallida (caso E), se maneja la siguiente solicitud después del caso C.)
(Si el caso A termina en Excepción, se lanza Excepción)
¿Alguien sabe una implementación existente, o tendré que implementarla yo mismo?