System.Web.Caching vs. Enterprise Caching Block

Per un componente .NET che verrà utilizzato sia nelle applicazioni Web che nelle applicazioni rich client, sembrano esserci due opzioni ovvie per la memorizzazione nella cache: System.Web.Caching o Ent. Lib. Blocco di memorizzazione nella cache.

  • Cosa usi?
  • Perché?

System.Web.Caching

È sicuro da usare al di fuori delle app Web? Ho visto informazioni contrastanti, ma penso che la risposta sia forse-kind-of-not-really.

  • un avvertimento relativo all’articolo KB contro l’utilizzo di app non web 1.0 e 1.1
  • La pagina 2.0 ha un commento che indica che è OK: http://msdn.microsoft.com/en-us/library/system.web.caching.cache(VS.80).aspx
  • Scott Hanselman è spaventato dalla nozione
  • La pagina 3.5 include un avvertimento contro tale uso
  • Rob Howard ha incoraggiato l’uso al di fuori delle app Web

Non mi aspetto di utilizzare uno dei suoi punti salienti, SqlCacheDependency , ma l’aggiunta di CacheItemUpdateCallback in .NET 3.5 mi sembra davvero una cosa buona.

Blocco di applicazioni di memorizzazione nella cache della libreria aziendale

  • altri blocchi sono già in uso, quindi la dipendenza esiste già
  • la persistenza della cache non è necessaria; rigenerare la cache al riavvio è OK

Alcuni elementi della cache dovrebbero sempre essere disponibili, ma essere aggiornati periodicamente. Per questi articoli, ottenere una richiamata dopo che un elemento è stato rimosso non è molto conveniente. Sembra che un client dovrà solo dormire e sondare fino a quando l’elemento della cache viene ripopolato.

Memcached per client Win32 + .NET

Quali sono i pro e i contro quando non hai bisogno di una cache distribuita ?

Questi sono gli elementi che considero per l’argomento del caching:

MemCach Win32 Velocity .net Cache Enterprise Caching Application Block

MemCached Win32: Fino a poco tempo fa ho usato MemCached Win32. Questo è simile a una web farm (molti server che offrono lo stesso contenuto per l’alta disponibilità), ma è una cache farm. Ciò significa che è ansible installarlo localmente sul tuo server web inizialmente se non hai le risorse per ingrandirle. Poi, mentre percorri la strada, puoi ridimensionare orizzontalmente (più server) o verticalmente (più hardware). Questo è un prodotto che è stato convertito dalla MemCached originale per funzionare su Windows. Questo prodotto è stato ampiamente utilizzato in siti ad alto traffico. http://lineofthought.com/tools/memcached

Velocità: questa è la risposta di Microsofts a prodotti come MemCached. MemCached è uscito da un po ‘di tempo, Velocity è in modalità CTP. Devo dire che da quello che ho letto finora questo prodotto sicuramente mi girerà la testa una volta uscito. Ma non riesco a portare avanti grandi progetti di produzione su un prodotto CTP con zero track record. Ho iniziato a giocare con esso anche se come una volta che guadagna lo slancio MemCached non sarà nemmeno comparabile per quelli bloccati nel mondo di Windows! http://blogs.msdn.com/velocity/

Cache .NET: non vi è alcun motivo per scartare la cache .NET standard. È integrato e pronto per l’uso gratuito e senza necessità di configurazione (principale). Offre flessibilità offrendo meccanismi per la memorizzazione di elementi nella memoria locale, un server di stato SINGLE o un database centralizzato. Laddove Velocity interviene quando è necessario più di un singolo server di stato (cache in memoria) e non si desidera utilizzare un database lento per contenere la cache.

Blocco di applicazioni aziendali: rimango lontano da tutti i blocchi di applicazioni aziendali. Sono quadri pesanti che danno più di quanto io richieda in generale! Finché ti ricordi di avvolgere tutto ciò che tocca il codice che non è il tuo e seguire le semplici regole per la codifica, segui tutti gli altri metodi su questo! (solo la mia opinione, naturalmente, MySpace sfrutta quanto più ansible di Enterprise Application Blocks!)

Non devi scegliere in anticipo! Generalmente creo un wrapper di cache che comunico con il mio codice per metodi come Get, Set, Exists, Remove, ListKeys, ecc. Questo quindi punta a un livello sottostante di astrazione della cache che può puntare a MemCached, Velocity o .NET. cache. Uso StructureMap (o scelgo un altro contenitore IoC) per iniettare quale forma di cache voglio usare per un determinato ambiente. Nella mia casella di sviluppo locale potrei utilizzare la cache .NET nella sessione. In produzione generalmente uso MemCached Win 32. Ma indipendentemente da come è impostato, puoi facilmente scambiare le cose per provare ogni sistema a vedere cosa funziona meglio per te. Devi solo assicurarti che l’applicazione sappia il meno ansible su come le cose vengono memorizzate nella cache! Una volta che questo strato di astrazione è a posto, puoi fare cose come eseguire un algoritmo di compressione (gzip) per tutti i dati che entrano e escono dalla cache, il che ti permetterebbe di memorizzare 10 volte la quantità di dati nella cache. – in modo trasparente .

Copro .NET Cache, MemCached Win32, StructureMap e le astrazioni appropriate nel mio libro, se sei interessato!

ASP.NET 3.5 Social Networking ( 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

Aggiorna Modificato il collegamento che elenca i siti utilizzando memcached. Grazie a David per aver notato che era rotto!

Tenere presente che la documentazione di EntLib indirizza in modo specifico verso la cache ASP.NET per le applicazioni ASP.NET. Questa è probabilmente la raccomandazione più forte per usarlo qui. Inoltre la cache di EntLib non ha dipendenze, il che per me è un grande motivo per non usarlo.

Non credo ci sia una limitazione tecnica in quanto tale sulla spedizione di System.Web come parte della tua app, anche se è un po ‘strano che abbiano messo tale avviso nella pagina .NET 3.5. Hanselman in realtà dice che ha iniziato a farsi beffe di questa nozione, ma si è convinto. Inoltre, se leggi i commenti, dice che il blocco ha troppe parti mobili e la cache ASP.NET è molto più leggera.
Penso che questo sia esattamente il tipo di problema che Velocity sta per risolvere, ma per ora è solo un’anteprima 🙁

Direi di usare Web.Caching e vedere come vai avanti. Se si mette un qualche tipo di livello di astrazione sopra, hai sempre la possibilità di sostituirlo successivamente con il blocco EntLib se trovi dei problemi.

Dai un’occhiata a memcached . È un sistema di caching distribuito veramente bello, veloce e leggero. Ci sono API per molte delle lingue più popolari, tra cui C #. Potrebbe non funzionare bene sul lato client (a meno che il client non ottenga i dati memorizzati nella cache da un server di qualche tipo), ma se si astraggono l’utilizzo di memcached su un’interfaccia specifica, è ansible implementare l’interfaccia con un’altra cache sistema.

@Davide Vosti

“Se lo inseriscono nello spazio dei nomi web, penso che sia per una buona ragione.” La stessa logica si applica al Concurrency and Coordination Runtime (CCR) nello studio robotico? no? non la pensavo così