Cómo usar el almacenamiento en caché en memoria en ASP.NET Core

ASP.NET Core es un marco sencillo y modular que se puede utilizar para crear aplicaciones web modernas de alto rendimiento en Windows, Linux o MacOS. A diferencia de ASP.NET heredado, ASP.NET Core no tiene un Cacheobjeto. Sin embargo, ASP.NET Core proporciona compatibilidad con varios tipos diferentes de almacenamiento en caché, incluido el almacenamiento en caché en memoria, el almacenamiento en caché distribuido y el almacenamiento en caché de respuestas.

En este artículo, veremos cómo puede mejorar el rendimiento y la escalabilidad de su aplicación ASP.NET Core almacenando datos que cambian con poca frecuencia en la memoria caché. Como siempre, incluiré ejemplos de código para ilustrar los conceptos discutidos. 

Cómo habilitar el almacenamiento en caché en memoria en ASP.NET Core

La caché en memoria en ASP.NET Core es un servicio que puede incorporar a su aplicación mediante la inyección de dependencias. Una vez que haya creado un proyecto ASP.NET Core en Visual Studio, puede habilitar la caché en memoria en el ConfigureServicesmétodo de la Startupclase como se muestra en el fragmento de código a continuación.

public void ConfigureServices (servicios IServiceCollection)

{

    services.AddMvc ();

    services.AddMemoryCache ();

}

Para trabajar con la caché en memoria en ASP.NET Core, debe usar la IMemoryCacheinterfaz. Así es como se ve: 

interfaz pública IMemoryCache: IDisposable

{

    bool TryGetValue (clave de objeto, valor de objeto);

    ICacheEntry CreateEntry (clave de objeto);

    anular Eliminar (clave de objeto);

}

Puede registrar el IMemoryCacheen el  ConfigServicesmétodo utilizando el AddMemoryCachemétodo que examinamos anteriormente. Luego, debe inyectar el objeto de caché en el constructor de su clase de controlador como se muestra en el fragmento de código a continuación.

  caché IMemoryCache privada;

  public CacheController (caché de IMemoryCache)

        {

            this.cache = cache;

        }

Y eso es todo lo que necesita hacer para configurar la compatibilidad con el almacenamiento en caché en memoria en su aplicación ASP.NET Core. En la sección que sigue, veremos cómo podemos trabajar con la API de caché en ASP.NET Core para almacenar y recuperar objetos.

Cómo almacenar y recuperar objetos usando ASP.NET Core IMemoryCache

Para almacenar un objeto usando la IMemoryCacheinterfaz, debe usar el Set()método que se muestra en el fragmento de código a continuación. Tenga en cuenta que la versión del Set()método que hemos utilizado en este ejemplo acepta dos parámetros. El primer parámetro es el nombre de la clave y el segundo parámetro es el valor, es decir, el objeto que se va a almacenar en la caché que se puede identificar mediante la clave.

[HttpGet]

        cadena pública Get ()

        {

            cache.Set ("Clave", DateTime.Now.ToString ());

            return "Este es un método de prueba ...";

        }

Para recuperar un elemento del caché, puede aprovechar el Get()método que se muestra a continuación.

  [HttpGet ("{clave}")]

        cadena pública Get (clave de cadena)

        {

            return cache.Get (clave);

        }

Puede utilizar el TryGet()método en el objeto de caché para comprobar si la clave especificada existe en el caché. Aquí está la versión modificada de nuestro Getmétodo que ilustra cómo se puede lograr esto.

 [HttpGet]

        cadena pública Get ()

        {

            clave de cadena;

            string obj;

            if (! cache.TryGetValue (clave, fuera obj))

            {

                obj = DateTime.Now.ToString ();

                cache.Set (clave, obj);

            }

            return obj;

        }

Existe otro método, llamado GetOrCreate, que se puede utilizar para recuperar datos almacenados en caché según la clave proporcionada. Si la clave no existe, el método la crea.

[HttpGet]

        cadena pública Get ()

        {

            return cache.GetOrCreate ("Clave",

                cacheEntry => {

                            return DateTime.Now.ToString ();

                         });

        }

Tenga en cuenta que está disponible una versión asincrónica de este método llamada GetOrCreateAsync. Aquí está la lista completa de códigos de nuestra CacheControllerclase para su referencia.

usando el sistema;

utilizando Microsoft.AspNetCore.Mvc;

utilizando Microsoft.Extensions.Caching.Memory;

espacio de nombres InMemoryCaching.Controllers

{

    [Ruta ("api / [controlador]")]

    CacheController de clase pública: Controlador

    {

        caché IMemoryCache privada;

        public CacheController (caché de IMemoryCache)

        {

            this.cache = cache;

        }

        [HttpGet]

        cadena pública Get ()

        {

            return cache.GetOrCreate ("Clave",

                cacheEntry => {

                            return DateTime.Now.ToString ();

                         });

        }

    }

}

Cómo establecer políticas de vencimiento en datos almacenados en caché en ASP.NET Core

Tenga en cuenta que puede establecer políticas de caducidad absoluta y variable en sus datos almacenados en caché. Mientras que el primero se usa para especificar la duración durante la cual un objeto debe residir en el caché, el segundo se usa para especificar el tiempo durante el cual un objeto residirá en el caché cuando no hay actividad, es decir, el elemento se eliminará de la caché cuando transcurre la duración especificada de inactividad.

Para establecer políticas de vencimiento, use la MemoryCacheEntryOptionsclase como se muestra en el fragmento de código a continuación.

MemoryCacheEntryOptions cacheExpirationOptions = new MemoryCacheEntryOptions ();

cacheExpirationOptions.AbsoluteExpiration = DateTime.Now.AddMinutes (30);

cacheExpirationOptions.Priority = CacheItemPriority.Normal;

cache.Set ("Clave", DateTime.Now.ToString (), cacheExpirationOptions);

Tenga en cuenta el uso de la Prioritypropiedad en la MemoryCacheEntryOptions instancia en el fragmento de código anterior. La Prioritypropiedad especifica qué objetos (según la prioridad ya establecida) deben eliminarse de la caché como parte de una estrategia del tiempo de ejecución para recuperar memoria cuando el servidor web se queda sin espacio de memoria.

Para establecer la prioridad, usamos la CacheItemPriorityenumeración. Esto puede tener uno de estos valores posibles: Low, Normal, High y NeverRemove. El proveedor de caché en memoria en ASP.NET Core eliminará las entradas de caché cuando esté bajo presión de memoria, a menos que haya establecido la prioridad de caché en CacheItemPriority.NeverRemove.

También es posible que desee registrar una devolución de llamada que se ejecutará siempre que se elimine un elemento de la caché. El siguiente fragmento de código ilustra cómo se puede lograr.

cacheExpirationOptions.RegisterPostEvictionCallback

(CacheItemChangedHandler, esto);

Incluso puede establecer dependencias entre los objetos almacenados en caché. Por ejemplo, es posible que desee eliminar ciertos elementos de la caché si se eliminó algún elemento relacionado. Exploraremos esta y muchas otras características del almacenamiento en caché en ASP.NET Core en mis futuras publicaciones aquí. Hasta entonces, es posible que desee echar un vistazo a las páginas relevantes en la documentación de ASP.NET Core de Microsoft. 

Cómo hacer más en ASP.NET y ASP.NET Core:

  • Cómo usar el almacenamiento en caché en memoria en ASP.NET Core
  • Cómo manejar errores en ASP.NET Web API
  • Cómo pasar varios parámetros a los métodos del controlador de API web
  • Cómo registrar metadatos de solicitud y respuesta en ASP.NET Web API
  • Cómo trabajar con HttpModules en ASP.NET
  • Control de versiones avanzado en ASP.NET Core Web API
  • Cómo usar la inyección de dependencia en ASP.NET Core
  • Cómo trabajar con sesiones en ASP.NET
  • Cómo trabajar con HTTPHandlers en ASP.NET
  • Cómo usar IHostedService en ASP.NET Core
  • Cómo consumir un servicio WCF SOAP en ASP.NET Core
  • Cómo mejorar el rendimiento de las aplicaciones ASP.NET Core
  • Cómo consumir una API web ASP.NET Core con RestSharp
  • Cómo trabajar con el registro en ASP.NET Core
  • Cómo usar MediatR en ASP.NET Core
  • Cómo trabajar con el estado de la sesión en ASP.NET Core
  • Cómo usar Nancy en ASP.NET Core
  • Comprender el enlace de parámetros en ASP.NET Web API
  • Cómo cargar archivos en ASP.NET Core MVC
  • Cómo implementar el manejo de excepciones globales en ASP.NET Core Web API
  • Cómo implementar comprobaciones de estado en ASP.NET Core
  • Mejores prácticas de almacenamiento en caché en ASP.NET
  • Cómo utilizar la mensajería de Apache Kafka en .NET
  • Cómo habilitar CORS en su API web
  • Cuándo usar WebClient frente a HttpClient frente a HttpWebRequest
  • Cómo trabajar con Redis Cache en .NET
  • Cuándo usar Task.WaitAll frente a Task.WhenAll en .NET