El almacenamiento en caché o caching  es uno de los patrones utilizados más comunes en el desarrollo de software. Y es una técnica para reducir la carga en un servidor leyendo los datos del caché. Dependiendo de su necesidad, existen algunas técnicas diferentes que puede aplicar en su aplicación. En esencia, el caching hace una copia de los datos que se pueden devolver mucho más rápido que desde la fuente original.

Consideraciones previas:
  • El caching funciona bien con datos que no cambian o casi no.
  • Proporciona una mejor experiencia de usuario y hace que su sitio sea más rápido.
  • Si su página requiere una base de datos para renderizar, el caching de la página puede ser de gran ayuda para .
  • Para las páginas estáticas relativas, no personalizadas, podemos almacenar en caché la página completa tanto a nivel de cliente como de servidor.
  • Hay diferentes tipos de caché que se aplican según la situación, debemos asegurarnos de utilizar la idónea para cada escenario.

Hay dos tipos de caché, a saber, caché local y caché distribuido.

 

Caché local

La memoria caché local es local para cada instancia individual de una aplicación. Para cada instancia, habrá un almacén de caché separado y el contenido se guardará para cada caché de instancia. Aunque puede haber inconsistencias en los datos entre los diferentes almacenes de caché para cada instancia.

Azure proporciona un mecanismo de caché local mediante el uso de caché en rol, en .NET Core IMemoryCache para implementar el caching local.

Una de las formas más simples de implementar el caching se basa en IMemoryCache, que representa un caché almacenado en la memoria del servidor web. Las aplicaciones que se ejecutan en una granja de servidores (varios servidores) deben garantizar que las sesiones sean permanentes cuando se usa la memoria caché en memoria.

Entonces, veamos los pasos para una implementación simple de IMemoryCache

  1. Agregar soporte de caching a los servicios cuando se inicia la aplicación.

 

2. Podemos usar la inyección del constructor para obtener la instancia del proveedor de caché y también implementar el caching como en este ejemplo.


Unicorn Points:  En cualquier implementación de caching, se puede notar que se requiere la presencia de un key, eso es porque necesitamos identificar nuestros objetos de caché para acceder a ellos. Es importante resaltar que cualquier valor que recibamos como parámetro u externo al método, no debe usarse como key de la caché.


 

IMemoryCache requiere el paquete NuGet Microsoft.Extensions.Caching.Memory, que está disponible en el metapaquete Microsoft.AspNetCore.App.

Algunos problemas que se encontrarán con esta implementación simple de caching:

  • La memoria caché puede tomar mucha memoria, lo que podría provocar una excepción de memoria insuficiente y fallas. ໒ (• ́ ∧ • ̀) ७
  • Alto consumo de memoria.
  • Es posible que deba actualizar la caché.

 

Afortunadamente, esto ya no es un problema con las Políticas de desalojo (políticas de eliminación), estas son reglas para eliminar elementos de la memoria caché de acuerdo con alguna lógica son:

  1. La política Absolute Expiration eliminará un elemento de la memoria caché después de un período de tiempo fijo, pase lo que pase.
  2. La política Sliding Expiration eliminará un elemento de la memoria caché si no se accedió en un período de tiempo fijo. Entonces, si configuro la caducidad en 1 minuto, el elemento seguirá en caché siempre que lo use cada 30 segundos. Una vez que no lo use por más de un minuto, el elemento es eliminado.
  3. La política Size Limit, sirve para limitar el tamaño de la memoria caché.

 

Comencemos con la política de límite de tamaño Size Limit. Si no se establece, el caché crece sin límite. Si se establece el límite de caché, todas las entradas deben especificar el tamaño. La unidad de tamaño podría ser la que prefiera. Eso significa que «si se almacenan principalmente en caché de cadenas, cada tamaño de entrada de caché podría ser la longitud de la cadena».

El siguiente código crea un MemoryCache de tamaño fijo sin unidad accesible por inyección de dependencia:

 

 

Agregando todas las políticas de desalojo comunes mencionadas antes tenemos esto:

 

 

Desmenuzando el código, veamos en que consisten las políticas:

  1.  Prioridad. Los elementos de menor prioridad se eliminan primero. En realidad, puede establecer la prioridad con .SetPriority (CacheItemPriority.High). Los niveles son bajo, normal, alto y nunca eliminar.
  2. Se agregó SetSlidingExpiration (TimeSpan.FromSeconds (2)), que establece la caducidad deslizante en 2 segundos. Eso significa que si no se accedió a un elemento en más de 2 segundos, se eliminará.
  3. Se agregó SetAbsoluteExpiration (TimeSpan.FromSeconds (10)), que establece la caducidad absoluta en 10 segundos. Esto significa que el artículo será desalojado en 10 segundos si aún no lo estaba.

 

Caché Distribuida

 

Es una caché compartida por varios servidores de aplicaciones, que generalmente se mantiene como un servicio externo al servidor de aplicaciones para acceder a él. La memoria caché compartida se utiliza para datos que son de naturaleza dinámica y cambian mucho. Cuando se distribuyen los datos en caché, los datos:

  • Es coherente (coherente) en todas las solicitudes a varios servidores.
  • Sobrevive al reinicio del servidor.
  • No uses memoria local.

Uno de los escenarios perfectos para usar el almacenamiento en caché compartido son los datos transaccionales, que muchas instancias de una aplicación actualizan simultáneamente. Con el mecanismo de caché compartida, los datos se almacenan en una ubicación central y, por supuesto, es más lento que la caché local.

En este artículo, cubriremos la caché distribuida usando Redis Cache en Azure

Redis es un  servidor de diccionario remoto. Es una base de datos distribuida en memoria de código abierto. Es una caché de alto rendimiento, que puede almacenar datos en el formato-valor-clave. Azure proporciona un servicio administrado para Redis, por lo que no tenemos que instalarlo ni ejecutarlo manualmente.

 

Crear el caché de Redis

Redis Caché se puede crear en el Azure Portal con solo buscar en los recursos redis cache en el buscador. Para crear Redis Cache, tenemos que ingresar el nombre DNS, la suscripción, el grupo de recursos y más, como se muestra en el siguiente screenshot:

Configuring the .NET Core App to use Redis Cache on Azure

 

Una vez que, se crea el servicio de caché, es hora de configurar nuestra aplicación cliente .NET Core, agregando un paquete NuGet como StackExchange.redis. Para conectarse a Redis Cache, podemos agregar un espacio de nombres StackExchange, Redis, y crear una clase de conexión usando ConnectionMultiplexer, de la siguiente manera:

 

Ya una vez, realizada la conexión, podemos leer Redis Caché llamando al método GetDatabase del objeto de conexión:

 

 

Conclusiones

 

El almacenamiento en caché o caching es una herramienta excelente que tiene muchas ventajas, pero al mismo tiempo también puede ser un arma de dos filos sino  se implementa correctamente. Como vimos en este artículo, es una técnica para reducir la carga en un servidor leyendo los datos desde la caché. Dependiendo de su necesidad, existen algunas técnicas diferentes que puede utilizar según aplique. Espero que hayas disfrutado este post tanto como yo. Nos vemos en la próxima!