Caché
Descripción general
La caché se utiliza para almacenar datos de la aplicación y mejorar su rendimiento, siendo un factor clave para lograr un desempeño más rápido. Crono utiliza dos tipos de caché: caché estática y caché de solicitud.
Caché estática
La caché estática o de singleton se utiliza para objetos persistentes que deben vivir mientras la aplicación esté en ejecución o durante un período de tiempo específico. Puede ser utilizada a través de ICacheAdministrador
, que es un administrador de caché compuesto y de múltiples niveles. Aunque por defecto usa IMemoryCache
internamente, proporciona una API unificada tanto para caché en memoria como distribuida.
Si se instala un proveedor de caché distribuida (como Redis), se accede de la misma manera que la caché en memoria. Esto difiere de cómo .NET Core maneja el acceso a la caché, ya que expone dos APIs diferentes: IMemoryCache
e ICacheDistribuido
. Crono unifica ambas para aprovechar el carácter multinivel (ver más abajo).
Caché de solicitud
La caché de solicitud se utiliza para almacenar elementos que deben ser eliminados al completarse la solicitud. Para acceder a la caché de solicitud, se utiliza ICacheSolicitud
, que accede al diccionario HttpContext.Items
internamente. Si no existe un HttpContext
, se crea un diccionario local en su lugar.
Este enfoque permite manejar eficientemente el ciclo de vida de los objetos y optimizar el rendimiento de la aplicación.
Caché de aplicación
Caché multinivel
ICacheAdministrador
es un contenedor para múltiples almacenes de caché, representados por ICacheAlmacenamiento
. Cada método CRUD recorre todos los almacenes registrados para buscar, actualizar o eliminar elementos. Los almacenes en memoria tienen prioridad, mientras que los almacenes distribuidos se consultan después. El almacén predeterminado que utiliza ICacheAdministrador
es MemoriaCacheAlmacenamiento
, pero los módulos pueden proporcionar nuevos almacenes, como el módulo de Redis, que proporciona RedisCacheAlmacen
.
El diseño de la caché multinivel garantiza lo siguiente:
Una API unificada tanto para almacenes en memoria como para distribuidos
Rendimiento: Un almacén en memoria es MUCHO más rápido que uno distribuido.
ICacheAdministrador
siempre consultará primero los almacenes en memoria, y solo recurrirá a los almacenes distribuidos si el elemento no existe en memoria. Después de recuperar elementos de un almacén distribuido, el elemento se coloca también en el almacén en memoria, por lo que las lecturas subsecuentes devolverán el objeto desde la memoria.El
IBusMensajes
se encarga de sincronizar todos los almacenes en memoria en los nodos de una granja de servidores web. Por ejemplo, si el servidor A elimina un elemento del almacén distribuido, se enviará una notificación al servidor B para que también elimine el elemento de su almacén en memoria.
Debido a la API unificada, debes tener cuidado con los tipos de objetos almacenados en caché. Tus objetos deben ser serializables a través de JSON (usando Newtonsoft, no System.Text.Json). Asegúrate de que tu objeto:
Tenga un constructor público sin parámetros.
No tenga referencias circulares.
No produzca un gráfico de objetos demasiado grande.
No contenga tipos de propiedades que no sean serializables.
No sea un tipo de entidad derivado de
EntidadBase
. Nunca hagas eso, en serio… ¡es peligroso! 😀
Para resolver explícitamente el almacén de memoria o el almacén distribuido, sin depender del administrador compuesto multinivel, utiliza el servicio ICacheFabrica
. Hay dos métodos que resuelven una instancia de ICacheAdministrador
.
ObtenerMemoriaCache()
La instancia solo interactúa con la implementación actual de IMemoriaCacheAlmacenamiento
ObtenerCacheDistribuido()
La instancia solo interactúa con la implementación actual de ICacheDistribuidoAlmacenamiento
. Si no existe un almacén distribuido, se devuelve en su lugar un administrador de caché en memoria.
Last updated