Almacenamiento en caché en C # /. Net

Quería preguntarte ¿cuál es el mejor enfoque para implementar un caché en C #? ¿Existe la posibilidad de usar clases .NET dadas o algo así? Tal vez algo así como un diccionario que eliminará algunas entradas, si es demasiado grande, pero ¿dónde cuyas entradas no serán eliminadas por el recolector de basura?

Si está utilizando ASP.NET, podría usar la clase Cache ( System.Web.Caching ).

Aquí hay una buena clase de ayuda: c-cache-helper-class

Si se refiere al almacenamiento en caché en una aplicación de formulario de Windows, depende de lo que intenta hacer y de dónde intenta almacenar los datos en caché.

Hemos implementado un caché detrás de un servicio web para ciertos métodos
(utilizando el objeto System.Web.Caching ).

Sin embargo, es posible que también desee ver el Bloque de aplicación de almacenamiento en caché. ( Consulte aquí) que es parte de Enterprise Library para .NET Framework 2.0.

Si usa .NET 4 o superior, puede usar la clase MemoryCache .

Las clases de caché suministradas con .NET son útiles, pero tienen un problema importante: no pueden almacenar muchos datos (decenas de millones +) de objetos durante mucho tiempo sin matar a su GC. Funcionan muy bien si almacena en caché algunos miles de objetos, pero en el momento en que se mueve a millones y los mantiene hasta que se propaguen en GEN2, las pausas del GC eventualmente comenzarán a notarse cuando el sistema llegue a un umbral de memoria bajo y el GC necesite barrer todas las gens.

Lo práctico es esto: si necesita almacenar unos cientos de miles de instancias, use la memoria caché de MS. No importa si sus objetos son de 2 campos o de 25 campos, es aproximadamente el número de referencias.

Por otro lado, hay casos en que se deben utilizar RAM grandes, que son comunes actualmente, es decir, 64 GB. Para eso, hemos creado un administrador de memoria 100% administrado y un caché que se encuentra encima de él.

Nuestra solución puede almacenar fácilmente 300,000,000 de objetos en memoria en proceso sin gravar GC en absoluto, esto es porque almacenamos datos en segmentos grandes (250 mb) de byte [].

Aquí está el código: NFX Pile (Apache 2.0)

Y video: NFX Pile Cache – Youtube

MemoryCache en el marco es un buen lugar para comenzar, pero también podría considerar la biblioteca de código abierto LazyCache porque tiene una API más simple que la memoria caché y tiene un locking integrado, así como algunas otras características amigables para el desarrollador. También está disponible en nuget.

Para darle un ejemplo:

 // Create our cache service using the defaults (Dependency injection ready). // Uses MemoryCache.Default as default so cache is shared between instances IAppCache cache = new CachingService(); // Declare (but don't execute) a func/delegate whose result we want to cache Func complexObjectFactory = () => methodThatTakesTimeOrResources(); // Get our ComplexObjects from the cache, or build them in the factory func // and cache the results for next time under the given key ComplexObject cachedResults = cache.GetOrAdd("uniqueKey", complexObjectFactory); 

Hace poco escribí este artículo sobre cómo empezar a usar el caché en dot net que puede serle útil.

(Descargo de responsabilidad: soy el autor de LazyCache)

Para tiendas locales

  • .NET MemoryCache
  • NCache Express
  • Almacenamiento en caché de AppFabric

Tu pregunta necesita más aclaración. C # es un lenguaje, no un marco. Debe especificar en qué marco desea implementar el almacenamiento en caché. Si consideramos que desea implementarlo en ASP.NET, aún depende completamente de lo que quiere de Cache. Puede decidir entre el caché en proceso (que mantendrá los datos dentro del montón de la aplicación) y el caché fuera de proceso (en este caso, puede almacenar los datos en otra memoria que el montón como el servidor de caché de Amazon Elastic). Y también hay otra decisión que tomar entre el almacenamiento en memoria caché del cliente o el almacenamiento en memoria caché del lado del servidor. Usualmente en la solución tienes que desarrollar una solución diferente para el almacenamiento en caché de diferentes datos. Debido a que se basa en cuatro factores (accesibilidad, persistencia, tamaño, costo), debe decidir qué solución necesita.

Si buscas algo en Caché en ASP.Net, entonces miraría la clase Caché. Por ejemplo

 Hashtable menuTable = new Hashtable(); menuTable.add("Home","default.aspx"); Cache["menu"] = menuTable; 

Luego para recuperarlo de nuevo

 Hashtable menuTable = (Hashtable)Cache["menu"]; 

Podría usar un Hashtable

tiene búsquedas muy rápidas, no hay colisiones clave y sus datos no recogerán basura