Utilizar REDIS como proveedor de estado de sesión (y balanceo)

Hola, en este artículo vamos a ver como almacenar el estado de sesión de ASP.NET en REDIS, pudiendo servir para escalamiento horizontal de nuestra solución, al contrario de InProc que almacena los datos de la sesión en memoria del mismo servidor web.

Redis es un motor de base de datos en memoria, basado en el almacenamiento en tablas de hashes (clave/valor) pero que opcionalmente puede ser usada como una base de datos durable o persistente. Está escrito en ANSI C por Salvatore Sanfilippo quien es patrocinado por VMware.1 2 y está liberado bajo licencia BSD por lo que es considerado software de código abierto.

REDIS se comporta bastante bien  como almacén de sesiones, de hecho puedes ver una buena presentación sobre esto

Si ahora estas convencido, vamos a hacer el primer paso, que es descargar REDIS para Windows de la siguiente URL:

https://github.com/rgl/redis/downloads

Siguiente, siguientes… y listo, luego en c:

image

Luego verás REDIS instalado en c:Program FilesRedis

image

Puedes cambiar la configuración dentro de la carpeta conf en el archivo redis.conf, como puerto, contraseñas y mucho más.

Ahora debes correr el servicio con redis-server.exe

image

Luego vamos a utilizar el proyecto que está en la siguiente URL http://chadmeyercodez.wordpress.com/2012/07/06/redis-session-state-provider-for-asp-net/

En donde se dieron el trabajo de programar el proveedor de sesión y tambien de roles y membership, aunque nosotros para este ejemplo solo veremos el tema de la sesión. Puedes descargar el proyecto con todos los proveedores desde acá:

https://dl.dropboxusercontent.com/u/1303802/AspNetRedisProviders-master.zip

Nota: este proyecto no me pertenece, aunque es público.
Esta es la estructura del proyecto, en mi caso voy a extraer lo que necesito, para efectos de simplificar la solución:

image

Pd: esta solución utiliza BookSleeve como cliente de REDIS, si quieres puedes instalarlo desde Nuget http://www.nuget.org/packages/BookSleeve/

PM> Install-Package BookSleeve

Y bueno, ahora nuestro proyecto, voy a crear uno desde cero e ir incluyendo lo que necesitamos, mi proyecto va a ser mega simple , la gráfica es la siguiente:

image

La funcionalidad es mínima, lo que nos interesa es que funcione bien el almacenamiento de estado de sesión y además el compartir las sesiones en una granja de servidores, simuladas por dos sitios web en mi misma máquina, los cuales no comparten app pool, pero deben compartir sesiones, de manera de que si un sitio cae, siga funcionando sin problemas las sesiones en el otro sitio, básicamente es lo siguiente:

image

Veamos el código asociado a la pantalla, es casi cero:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

namespace RedisDemo

{

    public partial class _Default : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            if (!Page.IsPostBack)

            {

                lb_session.Text =Convert.ToString(Session["test"]);

            }

        }

 

        protected void Button1_Click(object sender, EventArgs e)

        {

            Session["test"] = TxSession.Text;

        }

    }

}

Como ves, lo único que hace es setear la sesión y cuando se carga por primera vez la página, o si quieres,  cuando no hace postback, obtiene el valor de la sesión.

Se debe agregar la siguiente línea al web.config dentro de system.web para indicar el nuevo proveedor de estado de sessión

<sessionState mode="Custom" customProvider="RedisSessionProvider">

<providers>

<add name="RedisSessionProvider"
      type
="RedisProviders.RedisSessionStateStoreProvider, RedisProviders"
/>

</providers>

</sessionState>

Para este demo, mi configuración del IIS tengo lo siguiente:

image

Dos sitios web con la misma aplicación, Sitio 1 en el puerto 8080 y Sitio 2 en el puerto 8081:

image

Ahora seteo en Sitio 1 la sesión con el valor “Probando” y …

image

Al refrescar sitio 2 ya tiene el valor de la sesión Sonrisa, excelente!! Risa  al parar el sitio1 image

Volvemos a subir el sitio 1 y la sesión todavía existe Sonrisa, no se pierde:

image

Muy cool!, te dejo el código para que puedas probarlo:

DESCARGAR

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *