System.Web.Caching vs. Enterprise Library Caching Block

Para un componente .NET que se utilizará tanto en aplicaciones web como en aplicaciones de cliente enriquecido, parece haber dos opciones obvias para el almacenamiento en caché: System.Web.Caching o Ent. Lib. Bloque de almacenamiento en caché

  • ¿Que usas?
  • ¿Por qué?

System.Web.Caching

¿Es seguro usarlo fuera de las aplicaciones web? He visto información mixta, pero creo que la respuesta es quizás-amable-de-no-realmente.

  • una advertencia de artículo de KB contra 1.0 y 1.1 uso de aplicación no web
  • La página 2.0 tiene un comentario que indica que está OK: http://msdn.microsoft.com/en-us/library/system.web.caching.cache(VS.80).aspx
  • Scott Hanselman está asustado por la noción
  • La página 3.5 incluye una advertencia contra tal uso
  • Rob Howard alentó el uso fuera de las aplicaciones web

No espero utilizar uno de sus aspectos más destacados, SqlCacheDependency , pero la adición de CacheItemUpdateCallback en .NET 3.5 parece una cosa realmente buena.

Bloque de aplicación de almacenamiento en caché de Enterprise Library

  • otros bloques ya están en uso por lo que la dependencia ya existe
  • la persistencia de la memoria caché no es necesaria; regenerar la caché al reiniciar está bien

Algunos elementos de la memoria caché siempre deben estar disponibles, pero se actualizan periódicamente. Para estos artículos, obtener una callback después de que se haya eliminado un artículo no es muy conveniente. Parece que un cliente solo tendrá que dormir y sondear hasta que se vuelva a llenar el elemento de caché.

Memcached para Win32 + .NET cliente

¿Cuáles son los pros y los contras cuando no necesitas un caché distribuido ?

Estos son los elementos que considero para el tema de almacenamiento en caché:

Caché de MemCached Win32 Velocity .net Cache Enterprise Library Caching Application

MemCached Win32: Hasta hace poco usaba MemCached Win32. Esto es similar a una granja de servidores web (muchos servidores que ofrecen el mismo contenido para alta disponibilidad), pero es una granja de caché. Esto significa que puede instalarlo localmente en su servidor web inicialmente si no tiene los recursos para crecer. Luego, a medida que avanzas por la carretera, puedes escalar horizontalmente (más servidores) o verticalmente (más hardware). Este es un producto que fue portado desde el MemCached original para funcionar en Windows. Este producto se ha utilizado ampliamente en sitios de mucho tráfico. http://lineofthought.com/tools/memcached

Velocidad: esta es la respuesta de Microsofts a productos como MemCached. MemCached ha estado fuera por bastante tiempo, Velocity está en modo CTP. Debo decir que, por lo que he leído hasta ahora, este producto sin duda volverá la cabeza una vez que salga. Pero no puedo llevar a cabo grandes proyectos de producción en un producto CTP con cero historial. Empecé a jugar con él, aunque una vez que gana impulso, MemCached ni siquiera lo comparará con los que están encerrados en el mundo de las ventanas. http://blogs.msdn.com/velocity/

Caché .NET: no hay razón para descontar el caché .NET estándar. Está integrado y listo para usar de forma gratuita y sin necesidad de configuración (importante). Ofrece flexibilidad ofreciendo mecanismos para almacenar elementos en la memoria local, un servidor de estado SINGLE o una base de datos centralizada. Donde ingresa Velocity es cuando necesita más de un servidor de estado único (caché en la memoria) y no desea usar una base de datos lenta para almacenar su caché.

Enterprise Application Block: me mantengo alejado de todos los bloques de aplicaciones empresariales. ¡Son frameworks pesados ​​que dan más de lo que generalmente requiero! Siempre y cuando recuerde envolver todo lo que toca el código que no es el suyo y siga reglas simples para la encoding, ¡adhiérase a cualquiera de los otros métodos sobre este! (simplemente mi opinión, por supuesto, ¡MySpace aprovecha todo lo que puede de los bloques de aplicaciones empresariales!)

¡No tienes que elegir de frente! Generalmente creo un contenedor de caché con el que me comunico en mi código para métodos como Obtener, Establecer, Existe, Eliminar, ListKeys, etc. Esto luego apunta a un nivel subyacente de abstracción de caché que puede apuntar a MemCached, Velocity o .NET cache. Uso StructureMap (o elijo otro contenedor IoC) para inyectar qué forma de caché quiero usar para un entorno determinado. En mi cuadro de desarrollo local, podría usar el caché .NET en la sesión. En producción generalmente utilizo MemCached Win 32. Pero independientemente de cómo esté configurado, puede cambiar fácilmente las cosas para probar cada sistema y ver qué funciona mejor para usted. ¡Solo necesita asegurarse de que su aplicación sepa lo menos posible acerca de cómo se almacenan las cosas en caché! Una vez que esta capa de abstracción está en su lugar, puede hacer cosas como ejecutar un algoritmo de compresión (gzip) para todos los datos que entran y salen de la memoria caché, lo que le permite almacenar 10 veces la cantidad de datos en la memoria caché. – transparentemente .

Cubro .NET Cache, MemCached Win32, StructureMap, y las abstracciones apropiadas en mi libro si estás interesado.

Redes sociales ASP.NET 3.5 ( http://www.amazon.com/ASP-NET-3-5-Social-Networking-Enterprise-ready/dp/1847194788/ref=sr_1_1?ie=UTF8&s=books&qid=1225408005&sr=8 -1 ) Andrew Siemer http://www.andrewsiemer.com blog.andrewsiemer.com http://www.socialnetworkingin.net

Actualización Cambió el enlace que enumera los sitios que usan memcached. ¡Gracias David por darte cuenta de que estaba roto!

Tenga en cuenta que la documentación EntLib específicamente lo dirige hacia la caché ASP.NET para aplicaciones ASP.NET. Esa es probablemente la recomendación más fuerte para usarla aquí. Además, el caché EntLib no tiene dependencias, lo que para mí es una gran razón para no usarlo.

No creo que haya una limitación técnica como tal en el envío de System.Web como parte de su aplicación, aunque es un poco extraño que hayan publicado esa notificación en la página .NET 3.5. Hanselman en realidad dice que empezó a ser asqueado por esta idea, pero se convenció. Además, si lees los comentarios, él dice que el bloque tiene demasiadas partes móviles y que el ASP.NET Cache es mucho más ligero.
Creo que este es exactamente el tipo de problema que Velocity va a resolver, pero eso es solo una vista previa por ahora 🙁

Yo diría usar Web.Caching y ver cómo te va. Si coloca algún tipo de capa de abstracción encima de ella, siempre tiene la opción de cambiarla para el bloque EntLib más adelante si encuentra problemas.

Echa un vistazo a memcached . Es un sistema de caché distribuido realmente genial, rápido y liviano. Hay API para varios de los idiomas más populares, incluido C #. Puede que no sirva bien en el lado del cliente (a menos que el cliente obtenga los datos en caché de un servidor de algún tipo), pero si abstrae su uso de memcached a una interfaz específica, podría implementar la interfaz con otro almacenamiento en caché sistema.

@Davide Vosti

“Si lo ponen en el espacio de nombres web, creo que es por una buena razón”. ¿Se aplica esa misma lógica al Tiempo de Concurrencia y Coordinación (CCR) en el estudio robótico? ¿no? no lo creo