2009-08-20 13 views
13

Estoy construyendo una tienda web con muchos departamentos y categorías. Se almacenan en nuestra base de datos y se accede a ellos con frecuencia.Asp.net - Caching vs Static Variable para almacenar un Dictionary

Estamos utilizando la reescritura de URL por lo que casi cada solicitud dentro de la tienda genera una búsqueda. También necesitamos iterar sobre los datos con frecuencia para generar menús para la tienda principal y las páginas del departamento.

Esta información no cambiará a menudo, así que estoy pensando que debería cargar la base de datos en un diccionario para acelerar la recuperación de información.

Sé que la práctica estándar es cargar datos en la memoria caché de la aplicación; sin embargo, supongo que hay algún nivel de serialización durante el almacenamiento en caché, y para una gran estructura de datos estoy pensando que la sobrecarga sería significativa.

Mi impulso en esto es poner el diccionario en una variable estática en una de las clases relacionadas. Sin embargo, me gustaría obtener información de entrada sobre esto. ¿Estoy en lo cierto al pensar que este método sería más rápido? ¿Es una práctica horrible? ¿Hay una mejor manera de que me esté perdiendo?

Parece que no puedo encontrar mucha información sobre esto y agradecería cualquier información que pueda compartir. ¡Gracias!

Respuesta

19

Las colecciones de aplicaciones y caché no serializan los objetos que pasan a ellas, sino que almacenan la referencia real. Recuperar un objeto de la memoria caché no será una operación costosa, sin importar qué tan grande sea el objeto. Siempre apegue a los objetos de caché a menos que tenga una muy buena razón para no hacerlo, es una buena práctica.

Lo único que vale la pena mencionar es asegurarse de que piensa en el acceso multiproceso a esta colección. Va a terminar con algunos problemas serios muy rápidamente si no bloquea correctamente

+0

Muchas gracias- Eso es precisamente lo que necesitaba saber. –

+0

contento de ayudar :) – LorenVS

+4

Solo asegúrese de que, si está utilizando la aplicación o el caché, son por máquina. Si tiene varias máquinas (por ejemplo, una granja de servidores web), entonces tiene problemas ... y deberá usar una solución de almacenamiento en caché escalable, como Microsoft Velocity o MemCacheD (la 'D' es para Daemon). –

3

memcached es tu amigo! (pero podría ser exagerado si no está escalando)

¿Alguna idea de cuán grande sería su diccionario en la memoria caché de la aplicación? Estaría tentado de recomendar eso como una buena primera opción.

+0

Estoy viendo algunas docenas de departamentos y unas pocas cientos de categorías junto con la información asociada ... así que en cuanto al tamaño, no debería ser tan malo. Mi única duda con el uso del almacenamiento en caché a nivel de base de datos es que con cada llamada todavía tengo que convertir los objetos devueltos por la base de datos en sus tipos asociados. También hay algunos datos asociados como la url que esperaba calcular previamente. Dado que con frecuencia necesitaré obtener listas largas de estos artículos, pensé que debería almacenar en caché más adelante en la línea. ¡Todavía es definitivamente una buena opción y realmente aprecio la información! –

4

Bueno, no creo que sea mucho trabajo reescribir el código para usar un campo estático en lugar de la caché de la aplicación si es necesario para hacerlo Yo personalmente usaría el caché primero. No hay necesidad de una optimización prematura, ¿ha medido el rendimiento? Puede comportarse correctamente con el objeto de caché de la aplicación. Tal vez incluso funciona bien con consultas db? :)

Entonces, mi respuesta es - use la caché y vea cómo funciona.