2012-09-26 12 views
18

Estoy buscando implementar el almacenamiento en caché en un nivel de solicitud para un Servicio WCF. Cada solicitud a este servicio realiza una gran cantidad de llamadas a la base de datos. Piensa en múltiples recolectores de datos. Necesitamos permitir que un recopilador de datos acceda a la información que ya recuperó un recopilador de datos anterior.Caché de memoria o diccionario concurrente?

Estaba buscando utilizar el nuevo caché de memoria .Net 4.0 para esto mediante la creación de una instancia específica por solicitud.

¿Es esta una buena idea? ¿O debería simplemente usar un objeto de diccionario?

BTW: La recopilación de datos va a ser en paralelo, por lo que habrá más complejidades en el bloqueo, pero también podría usar colecciones concurrentes para eso.

+0

Actualización: he decidido usar la colección simultánea porque eso modela mi necesidad mejor que una memoria caché de nivel de sistema. –

+0

Según entiendo la clase MemoryCache, es una memoria caché de nivel de proceso ... – Legends

+0

o incluso nivel AppDomain, no lo he probado. – Legends

Respuesta

25

Si no necesita algún tipo de lógica de expiración, le sugiero que use colecciones concurrentes. Puede implementar fácilmente un single entry caching mechanism combinando las clases ConcurrentDictionary y Lazy. Aquí está el enlace another sobre la combinación Lazy y ConcurrentDictionary.

Si necesita que sus artículos caduquen, entonces es mejor utilizar el MemoryCache incorporado e implementar double-checked locking pattern para garantizar la recuperación de elementos de caché. Puede encontrar una implementación lista para usar de doble bloqueo verificado en Locking pattern for proper use of .NET MemoryCache

+0

Ok - Estaba pensando en la misma línea, pero todavía no entiendo el "¿por qué?" de eso MemoryCache me proporciona algunas funciones específicas de caché como AddOrGet. Perderé eso cuando cambie a colecciones concurrentes. ¿Es la funcionalidad de caducidad la única razón para elegir entre Concurrent Collection versus MemoryCache? –

+1

@zync La idea de utilizar ConcurrentDictionary con Lazy es garantizar que recupere los elementos de la memoria caché una vez por cada dominio de aplicación y nunca los cambie. Si este no es el caso, MemoryCache es mejor. Sin embargo, si necesita lógica de recuperación de entrada única, el uso de ConcurrentDictionary es más apropiado porque el método MemoryCache.AddOrGetExisting necesita un valor y aún tendrá que implementar el bloqueo al recuperar este valor. Pero con ConcurrentDictionary.GetOrAdd (tecla TKey, Func valueFactory) combinado con Lazy, dejas todo ese bloqueo a la biblioteca de framework. –

+3

Por cierto si sus elementos de caché están bien definidos antes de que comiencen sus servicios (es decir, no caché dinámicamente) y puede cargar cargando todos los datos en caché una vez, puede usar el constructor estático de sus clases de servicio para cargar esos elementos de caché . Esto es mejor porque se garantiza que los constructores estáticos se ejecutarán una vez por cada dominio de aplicación y antes de que se ejecute cualquier constructor de instancia de ese tipo. Es simple. –

Cuestiones relacionadas