Trabajando con el servicio de cache de Redis de Azure con .NET

Redis cache es un servicio de cache ofrecido en modo Preview desde el día 12 de Mayo de 2014. Redis, según su propia descripción es “un almacén avanzado basado en llave-valor, con licencia BSD y open source. También es referido como un servidor de estructuras ya que puede contener, strings, hashes, list, sets y sorted sets.

La novedad con respecto a los servicios tradicionales de cache, es que en el caso de Redis tiene el mismo alto rendimiento con operaciones sobre tipos de datos. Eso permite que Redis ejecute de manera atómica operaciones sobre esos tipos de datos, operaciones como por ejemplo adjuntar un string, añadir un elemento a una lista, ect.

Redis se puede instalar en una máquina virtual y ejecutar localmente, la versión de Windows esta mantenida por Microsoft Open Tech se puede bajar el código fuente del repositorio de GitHub.

Una vez que se ha bajado y compilado la versión de Windows (sólo x64) se puede ejecutar el proceso redis-server.exe

clip_image001

A partir de este punto se puede ejecutar comandos al servidor directamente.

Azure Redis Cache (Preview)

El servicio de Redis se ofrece en Azure en dos tiers:

Básico: Un único nodo de cache (ideal para entornos de prueba y desarrollo con una baja carga de trabajo)

Estandar: Un servicio de cache dedicado (dos nodo, uno maestro y otro esclavo)

clip_image003

Se puede encontrar más detalles sobre el previo del servicio aquí.

Para dar de alta el servicio hay que entrar en https://portal.azure.com/ y desde ahí seguir los pasos seleccionado el tier del servicio y el tamaño de los nodes. Una vez creado el servicio, se puede acceder al panel de control del estado del servicio:

clip_image005

Redis C# client

Una vez que el servicio está ejecutándose en Azure, el siguiente paso es consumir desde una aplicación en .NET el servicio de Redis. Hay conectores para todo tipo de lenguajes, la lista completa se puede encontrar aquí https://redis.io/clients.

En este caso se va a utilizar el cliente de Redis desarrollado por StackExchange la red que gestiona portales web como stackoverflow.com. Este paquete se puede conseguir desde Nuget.

clip_image007

A partir de este instante se puede crear una instancia de la clase RedisClient para poder conectarse al servicio de Redis, para ello se necesita la URL completa del servicio, el puerto, que puede variar en caso de utilizar SSL o no y una llave de acceso.

 RedisClient client = new RedisClient("myservice.redis.cache.windows.net", 6379, "");

Se pueden hacer las operaciones básicas para establecer y obtener valores basados en llaves, como hacen todos los sistemas de gestión de cache distribuidas, pero además de todo eso, Redis, permite ejecutar operaciones atómicas sobre tipos de datos como listas, hash.

 client.Add("key", "value");
string value = client.Get<string>("key");
client.AddItemToList("myList", "item1");
client.AddItemToList("myList", "item2");
client.AddItemToList("myList", "item3");
client.AddItemToList("myList", "item4");
client.AddItemToList("myList", "item5");
var list = client.GetAllItemsFromList("myList");

De esta manera se puede integrar directamente Redis en el desarrollo de una aplicación, del tipo que sea, consola, web, ect. Además se puede utilizar desde aplicaciones que están fuera de Azure.

ASP.NET Session State Provider

Cuando se tiene una aplicación web que tiene más de una máquina virtual y esa aplicación Web utiliza el proveedor de sesión de ASP.NET pueden aparecer problemas de sesión. Esto es así porque ASP.NET está configurado de manera predeterminada para utilizar la propia memoria RAM. En este sentido Redis es un servicio que se puede utilizar para almacenar los objetos de la sesión de ASP.NET.

Para instalar el paquete hay que ejecutar el siguiente comando:

Install-Package Microsoft.Web.RedisSessionStateProvider –Pre

Después hay que configurar el fichero de web.config para establecer de manera predeterminada el proveedor de Redis:

 <sessionState mode="Custom" customProvider="MySessionStateStore">
    <providers>
        <!--
        <add name="MySessionStateStore" 
        host = "127.0.0.1" [String]
        port = "" [number]
        accessKey = "" [String]
        ssl = "false" [true|false]
        throwOnError = "true" [true|false]
        retryTimeoutInMilliseconds = "0" [number]
        />
        -->
    <add name="MySessionStateStore" 
type="Microsoft.Web.Redis.RedisSessionStateProvider" host="127.0.0.1" accessKey="" ssl="false" />
    </providers>
</sessionState>

 

Luis Guerrero.

Technical Evangelist Microsoft Azure

@guerrerotook