Red de conocimiento informático - Conocimiento informático - Cómo hacer que Redis administre una sesión

Cómo hacer que Redis administre una sesión

0. ¿Qué es Redis?

Redis es una base de datos clave-valor de código abierto, habilitada para web, basada en memoria, persistente y basada en registros escrita en ANSI C con una API multilingüe

-- Wikipedia

1. Comparación de esquemas de guardado del estado del usuario

En términos generales, durante el proceso de desarrollo, el estado del usuario se guarda a través de sesiones o cookies. En el desarrollo general, se utilizan sesiones o cookies para guardar el estado del usuario. Ambos métodos tienen sus ventajas y desventajas.

Sesión: el modo InProc se pierde fácilmente y causa problemas de simultaneidad. Si utiliza SQLServer o el modo SQLServer, consumirá rendimiento.

Las cookies pueden exponer fácilmente parte de la información del usuario, y el cifrado y descifrado también consumirán rendimiento.

Redis utiliza este método para resolver varios problemas:

1.

2.

3. Fácil de admitir clústeres multiusuario.

4. Capaz de ver usuarios en línea.

5. Posibilidad de implementar el inicio de sesión de usuario en un solo lugar. (Logrado mediante código, presentado más adelante)

6. Admite persistencia. (Por supuesto, puede que no sea útil)

2. Ideas de implementación

1. Sabemos que la sesión es en realidad el ID de sesión almacenado en la cookie. El ID de sesión se enviará a la cookie. servidor cada vez que el usuario visita. El servidor encuentra los datos de estado correspondientes al usuario a través de esta ID.

Aquí, mi método de procesamiento también es definir un ID de sesión en la cookie. Cuando el programa necesita obtener el estado del usuario, utilizará el ID de sesión como clave para buscar en Redis.

2. Al mismo tiempo, la sesión admite que si el usuario no accede a la sesión dentro de un cierto período de tiempo, la sesión se reciclará.

La función de tomar prestadas claves de Redis para respaldar el tiempo de vencimiento admite esta función, pero debe interceptar su propia solicitud para llamar a este método al renovar el programa (hay un ejemplo en la demostración)

El siguiente código Instrucciones de inicio

3./p>

Agregar configuración a web.config Esta configuración se utiliza para establecer la dirección de llamada de Redis para cada servicio, separada por. ,. Primero escribe al host

1 lt; appSettingsgt

2

3 lt;! --Dividir entre cada Redis, dividir. AppSettings["SessionRedis"];

string timeOut = ConfigurationManager.AppSettings["SessionRedisTimeOut"];

if (string.IsNullOrEmpty(sessionRedis))

{

arroja una nueva excepción ("a web.config le falta la configuración de SessionRedis, use la división entre cada Redis.

Debe ser el host primero");

}

if (string.IsNullOrEmpty(timeOut)==false)

{

TimeOut = Convert.ToInt32(timeOut);

}

var host = sessionRedis.Split(char.Parse(",")); writeHost = nueva cadena[] { host[0] };

var readHosts = host.Skip(1).ToArray();

ClientManagers = new PooledRedisClientManager(writeHost, readHosts, new RedisClientManagerConfig

{

MaxWritePoolSize = writeReadCount, //recuento de enlaces del grupo de enlaces "escribir"

MaxReadPoolSize = writeReadCount, //recuento de enlaces del grupo de enlaces "leer"

p>

{

AutoStart = true

});

}

Escribió un delegado para el control

// lt; resumengt;

/// Escribir

/// lt /summarygt; ; /summarygt;

/// lt; /// Escribir grupo de enlaces.

typeeparam name="F"gt;lt;/typeparamgt;

/// lt;param name="doWrite"gt;lt;/paramgt;

/// lt; returngt;lt;/returnsgt;

public F TryRedisWritelt;Fgt;(Funclt;IRedisClient, Fgt;doWrite)

{

PooledRedisClientManager prcm = new Managers( ).GetClientManagers();

IRedisClient client = null;

prueba

{

usando (client = prcm.GetClient() )

{

return doWrite(cliente);

}

}

captura (RedisException)

{

throw new Exception("Redis Write Exception.Host: " cliente.Host ", Puerto. " cliente.Puerto

}

finalmente

{

if (cliente ! = null)

{

cliente.Dispose(); p>

}

}

}

Un ejemplo de llamada, el resto está en el código fuente

/ // lt ; Resumen gt;

/// Almacena el objeto en el caché en forma de Clave/Valor

/// Almacena objetos en el caché en forma de Clave/Valor

/// lt;/summarygt;

/// typeparam name="T"gt ; Clase de objetolt ;/typeparamgt;

/// lt;param name="value"gt; Para escribir setlt;/paramgt;

public void KSet(Dictionarylt; string, Tgt ; valor )

{

Funclt; IRedisClient, boolgt; fun = (cliente IRedisClient) =gt; SetAlllt; Tgt; (valor);

Devuelve verdadero;

};

TryRedisWrite(divertido); p>

4. Implementar sesión

Como se mencionó anteriormente, escriba el ID de sesión en la cookie

/// lt;

/// Estado del usuario; gestión

/// lt;/summarygt;

sesión de clase pública

{

/// lt;summarygt;

>

///Inicialización

/// lt;/summarygt;

/// lt;param name="_context"gt;lt;/paramgt; p>

sesión pública (HttpContextBase _context)

{

var contexto = _context;

var cookie = contexto.Request.Cookies.Get (Nombre de sesión )Get(Nombre de sesión);

if (cookie == null || string.IsNullOrEmpty(cookie.Value))

{

SessionId = NewGuid () ;

contexto.Response.Cookies.Add(new HttpCookie(SessionName, SessionId));

Contexto.

}

else

{

SessionId = cookie.Value

}

}

}

Método de acceso del usuario

/// lt; resumengt; Información del usuario

/// lt;/summarygt;

/// lt;typeparam name="T"gt;/typeparamgt;

/ //lt;returnsgt;lt;/returnsgt;

objeto público Getlt;Tgt;() donde T: clase, nuevo()

{

retorno new RedisClientlt;Tgt;().Get(SessionId);

}

/// lt;summarygt;

/// ¿Está el usuario en línea

p>

/// lt; /summarygt;

/// lt; returnsgt;

public bool()

{

return nuevo RedisClientlt; objectgt ().KIsExist(SessionId);

}

/// resumengt;

p>

/// Iniciar sesión

/// lt;/returnsgt;

/// lt;/summarygt;

/// lt ;typeeparam name="T"gt;lt;/typeparamgt;

/// lt;param name="obj"gt;lt;/paramgt;

public void Loginlt; Tgt;( T obj) donde T: clase, new()

{

new RedisClientlt ().KSet(SessionId, obj, new TimeSpan(0, Managers. TimeOut, 0 ));

}

6. Renovación

De forma predeterminada, el estado de inicio de sesión del usuario se cerrará dentro de los 30 minutos, por lo que el usuario cerrar la sesión cada vez. El tiempo de cierre de sesión del usuario debe retrasarse 30 minutos por cada visita

Esto requiere llamar al método de renovación de Redis

/// lt; >

// Extender

/// lt

/// lt; param name="key"gt; p> /// lt;param name="expiresTime"gt;lt;/param gt;

public void KSetEntryIn(clave de cadena, TimeSpan expiresTime)

{

Funclt; IRedisClient, boolgt; diversión = (cliente IRedisClient) =gt;

client.ExpireEntryIn(key, expiresTime);

Devuelve falso

};

TryRedisWrite(divertido); p>

}

p>

Paquete más tarde

// lt;summarygt;

// Renovación

// lt;/summarygt;

public void Postpone()

{

new RedisClientlt.objectgt ().KSetEntryIn(SessionId, new TimeSpan(0) , Managers.TimeOut, 0));

}

Aquí uso ActionFilter en MVC3 para interceptar todas las solicitudes de los usuarios

Prueba de espacio de nombres

{

public class SessionFilterAttribute: ActionFilterAttribute

{

/// lt; resumen

//Actualizado en cada solicitud

/// lt;/summarygt;

/// lt;param name="filterContext"gt;lt;/paramgt;

anulación pública void OnActionExecuting (ActionExecutingContext filterContext)

{

new Session(filterContext.Add(new SessionFilterAttribute());

}

protected void Application_Start ()

{

RegisterGlobalFilters(GlobalFilters.Filters);

}

5. Llamando

A haga que sea más fácil llamar prestado de 4.0 Nueva característica, agregue un atributo extendido al controlador

clase estática pública ExtSessions

{Sesión estática pública SessionExt (este controlador de controlador)

{

return new Session(controller.HttpContext);

}

}

Método de llamada

Método de llamada

clase pública HomeController: Controlador

{

índice público de ActionResult()

{

this.SessionExt(). IsLogin();

return View();

}

}

}

}