Un caché de disco de sistema de archivos persistente para ASP.NET

Resumen de: https://www.codeproject.com/articles/12097/cache-management-in-asp-net
Use diferentes términos para explicar el mismo concepto, es decir, administrar datos. Algunas personas se refieren a ella como gestión estatal y otras se refieren a ella como gestión de caché. Me gusta la palabra "caché". Pero conceptualmente, no hay diferencia entre estos dos.
Ahora discutamos diferentes aspectos de la gestión de caché (o gestión estatal) en ASP.NET.
Aunque la administración de caché no es un problema en las aplicaciones de Windows, siempre ha sido un desafío en el entorno web. Dado que HTTP es un protocolo sin estado y un servidor web no reconoce a los usuarios entre diferentes solicitudes, se vuelve muy importante para nosotros reconocer a un usuario particular entre diferentes solicitudes y también almacenar datos para que pueda reutilizarse entre diferentes solicitudes. ASP.NET proporciona muchas características para almacenar datos tanto en los lados del cliente (navegador) como en el servidor (servidor web), pero a veces nos confundemos con cuándo usar qué. En ASP.NET, nos encontramos con características como Session, Application y Cache Objects, pero es importante que comprendamos la diferencia entre ellos para usarlas de manera efectiva en aplicaciones web.
En este artículo, tocaré las diferentes opciones de administración de caché disponibles en ASP.NET. En una aplicación web, a veces requerimos almacenar datos en el lado del servidor para evitar una costosa operación de recuperación de datos de las tiendas de datos y el lento lógico de formato de datos para mejorar el rendimiento de la aplicación, así como para reutilizar los mismos datos en las solicitudes posteriores entre usuarios, aplicaciones y máquinas. Entonces, para lograr esto, necesitamos almacenar datos (caché) en el lado del servidor.
El almacenamiento en caché nos ayuda a lograr tres aspectos importantes de la QoS (calidad del servicio):
ASP.NET proporciona un objeto llamado objeto de aplicación para almacenar datos accesibles para todas las solicitudes de usuario. La vida útil de este objeto está vinculada a la aplicación y se recrea cada vez que comienza la aplicación. A diferencia del objeto de sesión ASP.NET, se puede acceder a este objeto a todas las solicitudes de usuario. Dado que este almacenamiento se crea y se mantiene en un espacio de dominio de aplicación, esto no debe usarse para el almacenamiento de datos en un escenario de la granja web. Esta opción es muy útil para almacenar datos como los metadatos de la aplicación (datos de archivos de configuración) que se pueden cargar al objeto de la aplicación durante el inicio de la aplicación y se puede usar durante la vida útil de la aplicación sin recargarlo cada vez para cada solicitud del usuario. Pero si existe el requisito de invalidar los datos en caché cada vez que hay algún cambio en los archivos de configuración mientras la aplicación se ejecuta, esta opción no debe usarse, ya que no proporciona ninguna función para expirar los datos en caché. Entonces, en este caso, se deben usar otras opciones como el objeto ASP.NET Cache, que se explica a continuación.
ASP.NET proporciona un objeto de par de valor clave: el objeto de caché que está disponible en el espacio de nombres System.Web.Caching. El alcance del mismo es el dominio de la aplicación y la vida útil está vinculada a la aplicación. A diferencia del objeto de sesión ASP.NET, se puede acceder a este objeto a todas las solicitudes de usuario.
Aunque tanto los objetos de aplicación como de caché se ven iguales, la diferencia clave entre ellos son las características adicionales proporcionadas por el objeto de caché, como las políticas y dependencias de vencimiento. Significa que los datos almacenados en el objeto de caché pueden expirarse/eliminar en función de algún límite de tiempo predefinido establecido por el código de aplicación o cuando la entidad dependiente se cambia, mientras que esta función no está disponible en el objeto de aplicación.
Discutamos las diferentes políticas de vencimiento y las dependencias que son compatibles.
La dependencia significa que un elemento se puede eliminar del caché cuando se cambia una entidad dependiente. Por lo tanto, una relación dependiente se puede definir en un elemento cuya eliminación del caché dependerá de lo dependiente. Hay dos tipos de dependencias compatibles en ASP.NET.
Ejemplo: Digamos que en mi aplicación, estoy usando un archivo XML para almacenar detalles de error (número de error de error y asignación de mensajes de error) que se utiliza para recuperar un mensaje de error para un número de error dado en tiempo de ejecución. Entonces, en lugar de leer el archivo del disco cada vez que necesito un mensaje de error, supongamos que decido cargarlo una vez al inicio de la aplicación y almacenarlo en el caché ASP.NET para su uso posterior. Entonces, si necesito cambiar el archivo de configuración para agregar nuevos mensajes de error o cambiar algunos de los mensajes de error existentes mientras la aplicación se ejecuta, ¿qué sucederá con mis datos en caché? ¿Necesito detener la aplicación y comenzarla nuevamente para reflejar los cambios de archivo en la aplicación? La respuesta es no. Los datos de caché se pueden invalidar cada vez que el archivo cambia utilizando la opción de dependencia del archivo.
La política de vencimiento establece la política de cómo y cuándo debe expirar un elemento en el caché.
El objeto Singleton de .NET comparte la misma instancia con varios clientes para que los objetos Singleton se puedan usar para almacenar y compartir datos entre diferentes invocaciones de clientes. Dado que .NET Remoting se puede usar fuera del proceso y la máquina, esta opción es muy útil cuando queremos almacenar en caché los datos y compartirlos entre servidores y usuarios, particularmente en un escenario de la granja web. En este enfoque, podemos almacenar los datos como variables miembros de Singleton Remoting Object y proporcionar métodos para leer y guardar datos. Pero al implementar esto, debemos asegurarnos de que el objeto a través del uso de caché no sea destruido por el recolector de basura. Para eso, tendremos que establecer el período de arrendamiento del objeto de caché a referencia en infinito para que el período de arrendamiento nunca se agote. Podemos hacerlo anulando el método InitialInizeLifetimesService de MarshalByRefobject y Devuelve NULL de este método. Pero el único problema con este enfoque es el rendimiento. Como dice el análisis, el rendimiento es muy pobre en este enfoque en comparación con otros enfoques. De todos modos, depende de los diseñadores/desarrolladores de aplicaciones analizar diferentes opciones y usar la mejor que se adapte al requisito.
Todos saben qué es un archivo mapeado de memoria. Básicamente se trata de asignar un archivo en el disco a una gama específica de direcciones en el espacio de direcciones de proceso de la aplicación. Esta opción permite que diferentes procesos usen los mismos datos aumentando el rendimiento de la aplicación. Como el uso de un archivo mapeado de memoria no es muy popular entre los desarrolladores de .NET, personalmente no sugeriría que este enfoque, ya que la implementación de esto implica muchas complejidades y también .NET Framework no lo admite. Pero si alguien está muy interesado en usar este enfoque, entonces tendrá que desarrollar su propia solución personalizada según sus propios requisitos.
Utilizamos variables estáticas para almacenar datos u objetos a nivel mundial para que puedan acceder a ellas durante la vida de la aplicación. Del mismo modo, en ASP.NET, podemos usar objetos estáticos para los datos de almacenamiento en caché y también podemos proporcionar métodos para recuperar y guardar datos en el caché. Como las variables estáticas se almacenan en el área del proceso, el rendimiento es más rápido. Pero dado que es muy difícil implementar políticas y dependencias de vencimiento en caso de variables estáticas, generalmente prefiero el objeto ASP.NET Cache sobre esta opción. Otro problema es que el objeto de caché estático personalizado debe ser seguro de hilo que debe implementarse cuidadosamente.
También podemos usar una base de datos para almacenar datos y compartir los datos entre usuarios y máquinas. Este enfoque es muy útil cuando queremos almacenar grandes cantidades de datos. Usar este enfoque para almacenar una pequeña cantidad de datos no es una buena idea debido al rendimiento. Para almacenar una pequeña cantidad de datos, debemos optar por otros mecanismos de almacenamiento de almacenamiento en proceso ASP.NET. Como los datos deben almacenarse en una base de datos, todos los objetos deben ser serializados XML para que sea más fácil almacenar y recuperar. También podemos usar otros tipos de formatos de serialización disponibles en el marco .NET.
A veces en nuestra aplicación, en algunas páginas, la salida generalmente no cambia por un período de tiempo específico. Por ejemplo, en un sitio web de recursos humanos, los detalles salariales de un empleado no cambian con mucha frecuencia y cambia solo una vez al mes. En general, cambia solo el primer día de cada mes. Entonces, durante un mes, la página de detalles del salario mostrará los mismos detalles para un empleado en particular. Entonces, en este caso, ¿no es una buena idea almacenar en caché la página en algún lugar del servidor para evitar el procesamiento de cálculo comercial, las llamadas a la base de datos y la lógica de representación de la página cada vez que el empleado desea ver sus detalles salariales. En mi opinión, ¡sí! Es una muy buena idea. Para lograr esto, ASP.NET proporciona una función para almacenar la salida de una página en el servidor durante un período de tiempo específico. También proporciona características para almacenar un fragmento de una página que se conoce como caché de fragmentos de página.
A veces es posible que necesitemos almacenar datos o páginas en el lado del cliente para mejorar el rendimiento de la aplicación. El uso de este mecanismo reduce la carga en el servidor, pero este mecanismo tiene algunos problemas de seguridad a medida que almacenamos en caché los datos en el lado del cliente.
Cookie es un almacenamiento del lado del cliente que se envía al servidor para cada solicitud y también recibe como respuesta desde el servidor. Debido a su limitación de tamaño, debe usarse para almacenar una pequeña cantidad de datos. Las políticas de vencimiento se pueden establecer para que las cookies invaliden los artículos después de un cierto período de tiempo.
ASP.NET ViewState es un concepto solo en Formas web (no MVC) donde los datos relacionados con las páginas y los controles se almacenan en la página generada (lado del cliente). que conserva los valores en múltiples solicitudes al servidor. ViewState se implementa internamente como campos ocultos cifrados en ASP.NET. ViewState no debe usarse para almacenar grandes cantidades de datos, ya que se pasa al servidor para cada solicitud.
El campo oculto es similar a cualquier otro control en una página, pero el estado visible de este control siempre es falso. Al igual que ViewState, no debemos usarlo para almacenar grandes cantidades de datos. Los marcos ocultos se pueden usar para almacenar datos en el lado del cliente, pero tenga en cuenta que los marcos ocultos no son compatibles con todos los navegadores de Internet.
Los navegadores de Internet proporcionan mecanismo de almacenamiento en caché a las páginas de almacenamiento en caché en el lado del cliente. Esto se puede establecer utilizando la Directiva Expires agregada al encabezado de las páginas o configurandola manualmente en el servidor web. Deberíamos usar esta opción para almacenar en caché las páginas, scripts, CSS e imágenes estáticos en el lado del cliente.
Hecho con ❤️ por Javier Cañon.