2010-01-15 16 views
7

Después de crear una prueba de concepto para un sitio ASP.NET MVC y asegurarme de que existía una separación adecuada de las preocupaciones, noté que estaba haciendo muchas llamadas redundantes de base de datos para información sobre el usuario actual.Almacenamiento en caché de los datos de usuario para evitar viajes de base de datos excesivos

Al ser históricamente una persona de escritorio y servicios, mi primer pensamiento fue almacenar en caché los resultados db en algunos static s. No fue necesario realizar muchas búsquedas para ver que al hacerlo persistirían los datos del usuario actual en todo el dominio de la aplicación para todos los usuarios.

Luego pensé en usar HttpContext.Current. Sin embargo, si coloca cosas aquí cuando un usuario está desconectado, entonces cuando inicien sesión, sus datos en caché estarán desactualizados. Podría actualizar esto cada vez que ocurra el inicio/cierre de sesión, pero no puedo decir si me parece correcto. A falta de otras ideas, aquí es donde me inclino.

¿Qué es una forma ligera de almacenar con precisión los detalles del usuario y evitar tener que hacer toneladas de llamadas a la base de datos?

+0

¿Qué tipo de datos necesita almacenar? Si solo se trata de unas pocas propiedades simples, es decir, cadenas, enteros, entonces podría almacenarlas en la cookie de formularios. – willbt

Respuesta

5

Si la información que desea caché es por usuario y sólo mientras están activos, entonces la sesión es el derecho lugar. gestión de estados de sesión
http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.aspx

+0

Aquí hay otra gran publicación que funciona en la parte superior de la sesión: http://stackoverflow.com/questions/343899/ – Dinah

+0

La sesión es realmente por sesión de navegador. Puede iniciar sesión como un usuario diferente utilizando el mismo navegador y el estado de sesión devuelto será el mismo que el del usuario anterior. – Appetere

+0

@Steve si ese es el caso, entonces la aplicación no se está manejando correctamente. – AUSteve

2

Lo que estamos buscando es System.Web.Caching.Cache

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx

+5

Para citar a MSDN "Se crea una instancia de esta clase por dominio de aplicación" que no es lo que OP deseaba. – AUSteve

+1

Estoy usando HttpContext.Current.Cache para almacenar IPrincipal con FormsAuthentication. Sesión significa otra cookie y problemas adicionales. – LukLed

+1

Soy muy consciente de que se crea una instancia por cada dominio de aplicación, pero qué hay de malo en agregar y recuperar de la memoria caché con una clave única para el usuario. p.ej. Usuario-1 donde 1 es el Id del usuario? Todavía resuelve el problema OMI. – willbt

2

ASP.NET es bueno para algunas situaciones, pero cuando se pone una carga pesada, que tiende a crear cuellos de botella en el rendimiento de ASP.NET. Lea más sobre esto aquí:

http://msdn.microsoft.com/en-us/magazine/dd942840.aspx

http://esj.com/articles/2009/03/17/optimize-scalability-asp-net.aspx

La solución para evitar los cuellos de botella es el uso de almacenamiento en caché distribuido. Existen muchas soluciones de caché distribuidas gratuitas en el mercado, como Memcached o NCache Express.

No sé mucho sobre Memcached pero he usado NCache Express de Alachisoft, le permite usar el almacenamiento en caché de ASP.NET sin requerir ningún cambio de código.

Cuestiones relacionadas