Azure Cache for Redis: Guía para principiantes

Hoy en día, las aplicaciones y los servicios web son el núcleo de cualquier negocio, por lo que incluso las pequeñas empresas tienen sus propios sitios o aplicaciones móviles. La latencia que experimentan los usuarios para obtener algunos datos repercute profundamente en la impresión que tienen al utilizar su solución, sobre todo si el objetivo del sitio es vender algunos productos. Además, un tiempo de carga de página prolongado también tiene implicaciones en el SEO (Search Engine Optimization) y puede reducir aún más el tráfico. Los mecanismos de almacenamiento en caché se crearon para ayudar a eliminar estos problemas. También pueden utilizarse para reducir las solicitudes innecesarias a la capa de datos almacenando los datos calculados en la memoria, de modo que las solicitudes futuras puedan atenderse de inmediato y se reduzca el consumo de recursos como, por ejemplo, la memoria. Para los servicios de alto tráfico, el uso del mecanismo de caché se ha convertido en algo imprescindible.

Redis es uno de los sistemas de almacenamiento de datos en memoria más populares que existen. En este artículo, proporcionaremos a los lectores una revisión general de lo que es, cómo se puede utilizar, y también examinaremos Azure Cache para Redis y ejemplos básicos de cómo empezar a trabajar con él. Así pues, repasemos todas estas cuestiones una por una.

Introducción a Redis

Como se menciona en la documentación oficial, Redis (que, por cierto, significa Servidor de Diccionario Remoto) es un almacén de estructuras de datos en memoria de código abierto (con licencia BSD), utilizado como base de datos, caché y agente de mensajes.

En esencia, Redis es similar a un almacén de valores clave. La diferencia radica en que en los almacenes tradicionales de clave-valor se asocian claves de cadena a valores de cadena, mientras que Redis admite estructuras de datos más complejas como cadenas, hashes, listas, conjuntos, conjuntos ordenados con consultas de rango, mapas de bits, HyperLogLogs, índices geoespaciales con consultas de radio y flujos. Todas las claves son seguras en binario, por lo que se puede utilizar cualquier secuencia binaria como clave, desde una cadena hasta el contenido de un archivo JPEG. El soporte de este amplio conjunto de tipos de datos complejos es la diferencia clave entre Redis y otras bases de datos clave-valor.

Redis también es extremadamente rápida. Esta es una de las razones por las que se utiliza para soluciones con datos que cambian rápidamente y a los que se accede con frecuencia. A veces, debido a esto, Redis se utiliza como una base de datos primaria alternativa y algunos de los desarrolladores encuentran que es una buena solución. A pesar de esto, necesitas recordar, que si tu servidor falla, pierdes todo lo que estaba en memoria, y este es el principal argumento para usarlo como almacenamiento transitorio.

Como se mencionó anteriormente, Redis es rico en características y se utiliza no sólo como almacenamiento, sino también en una serie de otros casos de uso, que se enumeran con una breve explicación a continuación:

  • Almacenamiento en caché de sesiones de usuario. Almacenar muchos datos en las cookies tiene un impacto negativo en el rendimiento. En lugar de esto, puede utilizar la caché en memoria.
  • Redis Pub/Sub. Está disponible desde la versión 2.0, e implementa el paradigma de mensajería Publish/Subscribe con mayor escalabilidad debido a la separación entre suscriptores y editores. En realidad no saben nada el uno del otro: los editores publican mensajes en los canales y los suscriptores reciben los mensajes que les interesan.
  • Colas. Dos tipos de colas permiten ejecutar tareas en un orden determinado o programar su ejecución.
  • Contadores. El nombre habla por sí solo. Se pueden crear contadores con nombre, cada uno de los cuales puede almacenar las 120 muestras más recientes con distintas precisiones temporales (como 1 segundo, 5 segundos, 1 minuto, etc.), y que pueden utilizarse para análisis en tiempo real.
  • Admite la ejecución de un lote de comandos como una única operación en forma de transacciones distribuidas.
  • Admite la creación de sus propias extensiones de secuencias de comandos para la base de datos Redis, utilizando el intérprete Lua integrado en Redis a partir de la versión 2.6.0.
  • Permite crear claves con un tiempo de vida limitado. Una vez expirado el tiempo de vida, dicha clave se borrará automáticamente.
  • Redis Sentinel proporciona alta disponibilidad para Redis, por lo que usándolo se puede crear un despliegue de Redis que resista sin intervención humana a ciertos tipos de fallos.

Redis se puede utilizar en muchas áreas como Gaming, Ad-Tech, Servicios Financieros, Sanidad e IoT. De hecho, ya ha sido utilizado con éxito por muchas empresas conocidas, como Twitter, GitHub, Weibo, Pinterest, Snapchat, Craigslist, Digg, Stack Exchange, Flickr y muchas otras. El propósito de uso varía de una empresa a otra. Algunas de ellas emplean Redis para el fin previsto, por ejemplo, GitHub lo utiliza como almacén persistente de claves/valores para la información de enrutamiento y otros datos diversos. Stack Exchange lo utiliza como nivel de caché. Flickr encuentra las listas Redis muy útiles y todos los eventos, subidas y actualizaciones a través del sistema de tareas se colocan en una cola en forma de lista Redis. Digg utiliza la funcionalidad de contadores para los contadores de eventos de página acumulativos. Y estos son sólo algunos ejemplos. En techstacks.io puedes encontrar una enorme lista de empresas que utilizan Redis. La popularidad de Redis está creciendo rápidamente y el número de empresas también aumenta.

Azure Cache para Redis

Cada vez más empresas se están moviendo hacia los servicios en la nube. Hay muchas empresas grandes y pequeñas en todo el mundo que confían en Microsoft Azure para ejecutar sus aplicaciones. Una de las características proporcionadas es Azure Cache para Redis, un servicio de caché seguro y dedicado de Microsoft. Se basa en Redis y se puede utilizar de la misma manera. Como se menciona en la documentación oficial, hay muchas situaciones en las que Azure Cache for Redis puede ser útil y son básicamente similares a los casos de uso de Redis. Este servicio está disponible en tres niveles, por lo que puede elegir el que mejor se adapte a su negocio en este momento. No ofrece un nivel de precio gratuito y, en realidad, no tiene sentido, porque siempre puedes probar Redis localmente para saber si resuelve tus problemas o no y, después, pasarte a Azure.

Azure Cache for Redis ofrece, por un lado, todo el conjunto de características y el ecosistema proporcionado por Redis y, por otro, el alojamiento y la supervisión fiables de Microsoft. He aquí un rápido resumen de las bondades producidas:

  • Azure Cache for Redis soporta una diversidad de lenguajes de programación como C, C#, Java, PHP, VCL, Fancy, Io, Lua, Perl, Rust, Go, Scala, Matlab, Python, por lo que no estás demasiado limitado a la hora de elegir un lenguaje de programación.
  • Dado que la capa de caché y la capa de aplicación están separadas, se pueden escalar de forma independiente, no dependen de la disponibilidad de la otra y esto proporciona más ventajas.
  • Tiene la capacidad de mantener los datos no sólo en memoria, sino en cualquier ubicación de almacenamiento de datos persistente. Esto permite que los datos estén disponibles después de eventos de fallo o hacer copias de seguridad de los datos y moverlos a otra instancia de Redis.
  • Utiliza autenticación Redis y también soporta SSL para asegurar la comunicación caché/cliente.
  • El servicio Microsoft Azure Cache for Redis también proporciona funciones como la replicación. Si la caché principal falla, la réplica se convierte en la principal y crea y rellena una nueva réplica para ella. Este proceso es automático y está gestionado por Microsoft Azure.
  • Como cualquier servicio de Microsoft Azure, Azure Cache for Redis permite monitorizar el estado del servicio, las métricas de uso, el rendimiento de la caché, configurar diferentes tipos de alertas, etc.
  • Incluso se puede programar una ventana de mantenimiento para la caché. Cuando se especifica, cualquier actualización del servidor Redis se realiza durante esta ventana.
  • Puedes importar o exportar datos a/desde Azure Cache for Redis, lo que realmente ayuda cuando necesitas pre-poblar datos o migrar entre instancias. Estas operaciones manipulan con archivo(s) RDB, que son completamente compatibles con Redis. Por lo tanto, puede exportar datos desde cualquier servidor Redis, sin importar dónde funcione, o puede trasladarse a cualquier otro servidor sin pérdida de datos.

La combinación de las características de Redis con un alojamiento fiable y un amplio conjunto de herramientas de Microsoft atrae a un gran número de empresas. Alaska Airlines, SiriusIQ, Stackify, Tata Consultancy Services y muchas otras eligen Azure Cache for Redis para sus soluciones. Los ámbitos de sus negocios son muy diferentes, lo que demuestra una vez más que puede aplicarse a muchas áreas. Ahora, cuando hemos revisado los propósitos generales del uso de Redis y tenemos una comprensión básica de la misma, vamos a seguir adelante y proporcionar un inicio rápido sobre cómo empezar con el uso de Microsoft Azure Cache para Redis con .NET.

Azure Cache para Redis: Inicio rápido

En realidad, empezar a utilizar Azure Cache for Redis es bastante sencillo. Todo lo que necesitas es crear y configurar una caché, configurar los clientes de caché para que puedan acceder a la caché. Vamos a repasar cada uno de estos pasos, para tener una visión clara del proceso.

Crear una caché

Ante todo, hay que aclarar que este repaso contiene muchos detalles que serán más interesantes para los principiantes.

Inicialmente, crea una cuenta, si no la tienes, e inicia sesión en el Portal Azure. Si ya estás familiarizado con él, puedes saltarte la siguiente explicación, de lo contrario, aquí tienes los pasos para crear el servicio Azure Cache for Redis:

  1. Haz clic en el botón «Crear un recurso» en la esquina superior izquierda;
  2. Busca «Azure Cache for Redis» y haz clic en el botón «Create»;
  3. Rellene los siguientes campos:
    • Nombre DNS – nombre de la caché;
    • Suscripción;
    • Grupo de recursos;
    • Ubicación. Debe elegirla con cuidado si crea el servicio para el proyecto existente, una región debe estar cerca de otros servicios que utilizarán la caché;
    • Nivel de precios. El nivel de precios determina el tamaño, el rendimiento y las características disponibles para la caché. El nivel Premium proporciona un conjunto más amplio de opciones, por ejemplo, le permite configurar el clúster Redis, red virtual, etc, pero ya que revisamos un ejemplo de uso básico, no revisaremos estas opciones;
    • «Habilitar el puerto no SSL (6379)» – esta opción es muy recomendable no usarla porque, en ella, las claves de acceso se envían vía TCP en texto claro y pueden comprometer el acceso a tu caché.

    Después de crear el servicio, su página de resumen debe estar disponible, donde puedes localizar el nombre del host, información de uso, información de carga del servidor, registros de actividad, claves y mucha otra información útil. El siguiente paso es crear el proyecto y configurarlo para utilizar Azure Cache for Redis.

Configuración del proyecto y del cliente caché

Puedes utilizar este servicio en diferentes tipos de proyectos, incluso probarlo a través de la herramienta de línea de comandos de Redis. En nuestro artículo, revisaremos un ejemplo de uso en la aplicación web ASP.NET Core. Crearemos un proyecto .NET Core desde cero para cubrir todos los pasos necesarios para empezar. Para ello, realiza los siguientes pasos:

  1. abrir Visual Studio;
  2. haga clic en la opción de menú «Archivo» y, a continuación, seleccione las opciones «Nuevo» y «Proyecto»;
  3. elija el tipo «ASP.NET Core Web Application»;
  4. introduzca el nombre del proyecto (para este ejemplo será «AzureRedisIntro»), su ubicación y haga clic en «Aceptar»;
  5. en el ejemplo utilizaremos ASP.NET Core 2.2, así que elígelo en el desplegable;
  6. seleccione la plantilla «API» de la lista.

Aquí hay capturas de pantalla del paso de creación del proyecto:

Azure Cache for Redis: Guía para principiantes

Dado que utilizamos .NET Core, necesitamos instalar el paquete «Microsoft.Extensions.Caching.Redis.Core» a través del gestor de paquetes NuGet. Para ello, basta con hacer clic con el botón derecho en el nombre del proyecto, seleccionar «Administrar paquetes NuGet…», cambiar a la pestaña «Examinar» y buscarlo.

Para conectarnos al servicio Redis creado, debemos copiar la «Cadena de conexión primaria» en el archivo de configuración. Puedes encontrarla en la página de resumen del servicio haciendo clic en la sección «Claves de acceso» en el panel de navegación. Así que el archivo de configuración debería tener este aspecto al final:

{
    "Logging": {
        "LogLevel": {
            "Default": "Warning"
        }
    },
    "AllowedHosts": "*",
    "CacheConnection": "[Primary connection string]"
}

Después de estos preparativos básicos, necesitamos configurar el acceso al servicio Redis de caché. Para ello, es necesario añadir el método AddDistributedRedisCache a la clase Startup.cs. Este método permite utilizar RedisCache mediante inyección de dependencias en cada parte del código que espere un objeto instancia que implemente la interfaz IDistributedCache. Aquí está el contenido completo del archivo «Startup.cs»:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
 
namespace AzureRedisIntro {
    public class Startup {
        public static string CacheConnection = "";
 
            public Startup(IHostingEnvironment env) {
                var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
                Configuration = builder.Build();
 
                CacheConnection = Configuration.GetConnectionString("CacheConnection");
            }
 
            public IConfiguration Configuration { get; }
 
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services) {
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
 
                services.AddDistributedRedisCache(options => {
                    options.Configuration = Configuration.GetConnectionString("CacheConnection");
                    options.InstanceName = "RedisIntro"; // Your DNS Name
                });
            }
 
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
                if (env.IsDevelopment()) {
                    app.UseDeveloperExceptionPage();
                }
                else {
                    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                    app.UseHsts();
                }
 
                app.UseHttpsRedirection();
                app.UseMvc();
            }
        }
    }
}

Uso del servicio Azure Cache for Redis

Azure Cache for Redis puede almacenar en caché objetos .NET serializados o tipos de datos primitivos. Para la serialización, puede elegir cualquier serializador, que es más conveniente para usted, y en este artículo, vamos a utilizar el paquete más común Newtonsoft.Json. Debería estar ya instalado si has repetido todos los pasos descritos.

Para nuestro ejemplo bastante simple, creamos un modelo para revisar un poco de almacenamiento de objetos .NET serializados en la caché. Para ello, basta con crear una nueva carpeta «Models» y añadir el archivo «Book.cs», que se enumeran a continuación, a la misma:

using System;
 
namespace AzureRedisIntro.Models {
    public class Book {
        public Guid ID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }
}

El modelo es bastante pequeño y limpio, por lo que no hay comentarios ni explicaciones, y pasamos al controlador. Después de crear el proyecto a partir de una plantilla, ya deberías tener un controlador, en nuestro caso llamado «ValuesController». Sustitúyelo por el siguiente código:

using AzureRedisIntro.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;
using Newtonsoft.Json;
using System;
 
namespace AzureRedisIntro.Controllers {
    [Route("api/[controller]")]
    [AllowAnonymous]
    public class ValuesController : Controller {
        private IDistributedCache _cache;
 
        public ValuesController(IDistributedCache cache) {
            _cache = cache;
        }
 
        [HttpGet("[action]")]
        public object GetCacheValue(Guid bookID) {
            if (bookID == Guid.Empty)
            return BadRequest("Incorrect identifier.");
 
            return JsonConvert.DeserializeObject(_cache.GetString(bookID.ToString()));
        }
 
        [HttpPost("[action]")]
        public object SetCacheValue([FromBody]Book model) {
            if (model == null)
            return BadRequest("Model is empty.");
            Book book = new Book() {
                Description = model.Description,
                Name = model.Name,
                ID = model.ID
            };
            _cache.SetString(book.ID.ToString(), JsonConvert.SerializeObject(book));
 
            return Ok();
        }
    }
}

Repasemos cada parte del código para comprender mejor el proceso. Ya hemos mencionado la interfaz IDistributedCache, por lo que su función debería estar clara por ahora, así que nos limitaremos a revisar los métodos proporcionados:

  • Get, GetAsync – acepta una clave de cadena y recupera un elemento de la caché como una matriz byte[] si se encuentra en la caché;
  • Set, SetAsync – añade un elemento (como matriz byte[]) a la caché utilizando una clave de cadena;
  • Refresh, RefreshAsync: actualiza un elemento de la caché en función de su clave, restableciendo su tiempo de expiración deslizante (si existe);
  • Remove, RemoveAsync – elimina un elemento de la caché basándose en su clave de cadena.

En el ejemplo, a través de los métodos «GetCacheValue» y «SetCacheValue», mostramos el uso de los dos primeros de la lista (y, como puedes ver, las variantes síncronas). Después de ejecutar un ejemplo estos métodos deberían devolver los siguientes resultados:

Azure Cache for Redis: Guía para principiantes
Azure Cache for Redis: Guía para principiantes

Como se puede ver después de estas breves revisiones, todo es bastante simple, y Azure Cache para Redis es realmente fácil de usar y fácil de iniciar el servicio.

Resumiendo

En este artículo, hemos tratado de hacer una visión general de Redis y Azure Cache for Redis, para mostrar los beneficios y casos de uso proporcionados. La mayor parte de la información debe ser útil para principiantes, o personas que estén interesadas en algunos detalles de uso. Esperamos que este artículo haya dado a los principiantes un punto de partida e inspirado a otros a aprender algo nuevo sobre ello o incluso empezar a usarlo.