.Net System.Runtime.Caching.MemoryCache - ¿Almacenar una sola colección u objetos personalizados individuales?

Estoy implementando el almacenamiento en caché utilizando MemoryCache (.net 4.0) para almacenar en caché datos globales que utilizarán todos los usuarios de mi sitio web.

Mi enfoque inicial: Almacene una KeyedCollection que contenga una colección de objetos del Cliente con una clave para obtener un solo objeto. Esta colección podría tener hasta 250 de estos objetos. Siempre que caduque la memoria caché, reconstruiría KeyedCollection y la agregaría a la memoria caché.

Nuevo enfoque Ahora, estoy pensando por qué no almacenar cada objeto Cliente directamente en el caché con el ID de cliente como clave de búsqueda. Por lo tanto, MemoryCache.Default tendría hasta 250 de estos objetos de Cliente en comparación con una única KeyedCollection. Beneficios:

  1. Más eficiente ya que obtendré el objeto Cliente directamente del caché sin tener que realizar otra búsqueda en la Colección con clave.
  2. Agregaría un nuevo objeto Cliente al caché solo cuando se solicite por primera vez. Una especie de adición perezosa en lugar de construir previamente todo el caché.

¿Alguna idea sobre el uso de uno frente al otro en términos de rendimiento y otros factores?

preguntado el 22 de mayo de 12 a las 17:05

¿Alguna razón por la que no está utilizando el caché ASP.NET integrado? msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx -

Estoy usando el MemoryCache incorporado (System.Runtime.Caching) -

1 Respuestas

La solución dependerá de la frecuencia con la que necesite trabajar en los objetos como una colección.

Razones para almacenar como una colección:

  • Almacenar cada objeto individualmente, si los 250 objetos siempre se llenan, ocupa más espacio, ya que cada elemento en caché tendría un asociado CacheItemPolicy. Este caso es probablemente poco probable, sin embargo.
  • no tendrías fuertemente tipado métodos de extensión puestos a disposición por Linq en colecciones. (Los métodos de extensión están disponibles, pero los elementos de MemoryCache se exponen como KeyValuePair<string, object>).

Razones para almacenar individualmente:

  • Solo o en su mayoría va a trabajar con un solo objeto a la vez.
  • Desea que cada objeto se cree y elimine de la memoria caché en función de su propia frecuencia de uso, en lugar de la de una colección completa.

Por lo tanto, compare su escenario de uso probable y elija en consecuencia. Lo más probable es que, a menos que esté escribiendo muchas .Where, .Select, etc., llama o tiene motivos para pasar toda la colección, entonces el almacenamiento individual será la mejor opción.

contestado el 22 de mayo de 12 a las 20:05

¿Existen implicaciones de rendimiento notables al tener una CacheItemPolicy para cada objeto? Pensé que 250 objetos es un número muy modesto y no debería tener problemas. Cada solicitud web solo utilizará un único objeto. Por lo tanto, no me gusta la idea de obtener la colección del caché y buscar cada solicitud. - dotnetster

No puedo decirlo con total certeza, pero aprendería, no, que la sobrecarga adicional de manejar el objeto en caché debería ser insignificante. Seguro que en tu caso pasará desapercibido. - Mike Guthrie

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.