2011-12-13 16 views
6

Tengo una consulta sql (proc almacenado) que tarda aproximadamente 8-10 segundos para volver antes de que los resultados se muestren en una red web. ¿Cuál es la mejor práctica para el rendimiento con respecto al almacenamiento en caché en asp.net-mvc3, por lo que el usuario no tiene que tomar esos 8-10 segundos cada vez para cargar esos datos (menos optimización de la consulta)?MVC3 técnicas de caché de datos

Respuesta

11

Puede usar la clase MemoryCache para almacenar el resultado de esta consulta bajo alguna tecla. La clave podría ser el hash de los criterios de consulta (si los tiene). Y aquí están some guides en MSDN sobre cómo usarlo.

Al implementar el almacenamiento en caché, tenga en cuenta que este caché se almacena en la memoria de forma predeterminada. Esto significa que si está ejecutando esta aplicación en una granja de servidores web, podría ser más interesante usar una memoria caché distribuida para que todos los nodos de la comunidad compartan los mismos datos en la memoria caché. Esto podría hacerse ampliando la clase ObjectCache con alguna solución de almacenamiento en caché distribuida. Por ejemplo, memcached es popular y tiene .NET provider. Otra solución de almacenamiento en caché distribuida es AppFabric.

+0

MemoryCache es probablemente la solución correcta, pero tengo algunos escenarios en los que los objetos se expulsan automáticamente de la memoria caché (con un MVC 3). ¿Cuál es tu consejo con respecto a eso? ¿Hay alguna configuración particular necesaria para que funcione con MVC? Oh, bueno, si quieres darle una oportunidad, ¿puedes leer http://stackoverflow.com/questions/7849000/memorycache-empty-just-after-adding-an-object? Todavía estoy luchando con ese problema y no puedo entender dónde estoy fallando. :(Gracias. – BigMike

+0

@BigMike, puede especificar una política de caducidad al almacenar objetos en la memoria caché. Podría definir expiración absoluta, caducidad, cambiar monitores, ... Es muy flexible. –

+0

sí, puedo, lo he intentado con caducidad de deslizamiento y expiración de tiempo absoluto. En algunos casos he desalojado todo aparentemente sin motivo. Lo curioso es que en mi devolución de llamada eliminada tengo una Razón de cachéespecífica de desalojo pero no puedo encontrar quién está desahuciando. – BigMike

3

Está almacenando en caché esta acción.

[OutputCache(Duration = 300)] 
public ActionResult Action(){ 

//some operation 

return View() 
} 
+0

Eso almacenará en caché toda la acción (por ejemplo, la acción ni siquiera se ejecutará), por lo que incluso si los datos cambian no se ejecutará durante los próximos 5 minutos. A veces puede ayudar, pero Al acceder a los datos, prefiero no utilizarlo. – BigMike

2

¿Con qué frecuencia cambian los datos subyacentes de este procedimiento almacenado? Si relativa poca frecuencia, puede utilizar característica muy buena - SqlCacheDependency

http://msdn.microsoft.com/en-us/library/ms178604.aspx

De esta manera su SP pesada se llamará sólo cuando es necesario, y el resultado se almacenará en caché el mayor tiempo posible.

+0

Thx para la respuesta. Probablemente necesite actualizarse cada 3-4 horas. Sin embargo, obtuve SqlCachDep Suerte trabajar así que gracias, pero probablemente necesite actualizarlo con más frecuencia. – JaJ

Cuestiones relacionadas