Domanda

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 "non proprio".

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

Blocco applicazione 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 essere sempre disponibili, ma aggiornati periodicamente.Per questi articoli, ricevo una richiamata Dopo un oggetto è stato rimosso non è molto conveniente.Sembra che un client dovrà semplicemente dormire ed eseguire il polling finché l'elemento della cache non verrà ripopolato.

Memcached per Win32 + Cliente .NET

Quali sono i pro e i contro quando non è necessario un file distribuito cache?

È stato utile?

Soluzione

Questi sono gli elementi che considero per l'argomento Caching:

Memcached Win32 Velocity .NET Cache Enterprise Libreria Caching Application Block

MemCached Win32: Fino a poco tempo fa ho utilizzato MemCached Win32.È simile a una web farm (molti server che servono lo stesso contenuto per un'elevata disponibilità) ma è una cache farm.Ciò significa che puoi installarlo inizialmente localmente sul tuo server web se non hai le risorse per diventare più grande.Quindi man mano che procedi puoi scalare orizzontalmente (più server) o verticalmente (più hardware).Questo è un prodotto convertito dal MemCached originale per funzionare su Windows.Questo prodotto è stato ampiamente utilizzato in siti a traffico molto elevato. http://lineofthinked.com/tools/memcached

Velocità: Questa è la risposta di Microsoft a prodotti come MemCached.MemCached è disponibile da un po' di tempo, Velocity è in modalità CTP.Devo dire che da quello che ho letto finora questo prodotto mi farà sicuramente girare la testa una volta uscito.Ma non riesco a gestire grandi progetti di produzione su un prodotto CTP con zero track record.Ho iniziato a giocarci, perché una volta acquisito slancio, MemCached non sarà nemmeno paragonabile a quelli bloccati nel mondo di Windows! http://blogs.msdn.com/velocity/

Cache .NET: Non vi è alcun motivo per escludere la cache .NET standard.È integrato e pronto per l'uso gratuitamente e non richiede alcuna configurazione (importante).Offre flessibilità offrendo meccanismi per archiviare elementi nella memoria locale, in un server a stato SINGOLO o in un database centralizzato.Il punto in cui interviene Velocity è quando è necessario più di un singolo server di stato (cache in memoria) e non si desidera utilizzare un database lento per conservare la cache.

Blocco di applicazioni aziendali: Sto lontano da tutti i blocchi di applicazioni aziendali.Sono strutture pesanti che danno più di quanto generalmente richiedo!Finché ti ricordi di avvolgere tutto ciò che tocca il codice che non è il tuo e di seguire semplici regole per la codifica, attieniti a uno qualsiasi degli altri metodi rispetto a questo!(solo la mia opinione ovviamente: MySpace sfrutta il più possibile i blocchi di applicazioni aziendali!)

Non devi scegliere in anticipo! In genere creo un wrapper di cache con cui comunico nel mio codice per metodi come Get, Set, Exists, Remove, ListKeys, ecc.Ciò punta quindi a un livello sottostante di astrazione della cache che può puntare alla cache MemCached, Velocity o .NET.Utilizzo StructureMap (o scelgo un altro contenitore IoC) per inserire la forma di cache che desidero utilizzare per un determinato ambiente.Nella mia casella di sviluppo locale potrei utilizzare la cache .NET nella sessione.In produzione generalmente utilizzo MemCached Win 32.Ma indipendentemente da come è impostato, puoi facilmente scambiare le cose per provare ciascun sistema e vedere cosa funziona meglio per te.Devi solo assicurarti che la tua applicazione sappia il meno possibile su come le cose vengono memorizzate nella cache!Una volta che questo livello di astrazione è a posto, puoi fare cose come eseguire un algoritmo di compressione (gzip) per tutti i dati che entrano ed escono dalla cache che ti consentirebbe di archiviare 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 network (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 www.andrewsiemer.com blog.andrewsiemer.com www.socialnetworkingin.net

AggiornamentoModificato il collegamento che elenca i siti che utilizzano memcached.Grazie David per aver notato che era rotto!

Altri suggerimenti

Tieni presente che la documentazione EntLib ti indirizza specificamente verso la cache ASP.NET per le applicazioni ASP.NET.Questa è probabilmente la raccomandazione più forte verso l'utilizzo qui.Inoltre la cache EntLib non ha dipendenze, il che per me è un ottimo motivo per non usarla.

Non penso che ci sia una limitazione tecnica in quanto tale sulla spedizione di System.Web come parte della tua app, anche se è leggermente strano che abbiano inserito tale avviso nella pagina .NET 3.5.Hanselman in realtà dice che all'inizio era spaventato da questa idea, ma poi 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 Velocità risolverà, ma per ora è solo un'anteprima :-(

Direi di utilizzare Web.Caching e vedere come te la cavi.Se metti una sorta di livello di astrazione sopra di esso, hai sempre la possibilità di sostituirlo con il blocco EntLib in seguito se riscontri problemi.

Dare un'occhiata a memcached.È un sistema di caching distribuito davvero interessante, veloce e leggero.Esistono API per molti dei linguaggi più popolari, incluso C#.Potrebbe non funzionare bene dal lato client (a meno che, ovviamente, il client non stia ottenendo i dati memorizzati nella cache da un server di qualche tipo), ma se astrai il tuo utilizzo di memcached in un'interfaccia specifica, potresti quindi implementare l'interfaccia con un altro caching sistema.

@Davide Vosti

"Se lo mettono nello spazio dei nomi Web, penso che sia per una buona ragione." La stessa logica si applica alla concorrenza e al runtime di coordinamento (CCR) nello studio robotico?NO?non la pensavo così.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top