Le applicazioni Web ASP.NET, le applicazioni dei servizi Web .NET e altre applicazioni server .NET devono gestire carichi di transazioni estremi senza rallentamenti. Anche se il livello dell'applicazione viene ridimensionato in modo lineare, il livello di archiviazione dati e database non viene ridimensionato e quindi diventa un collo di bottiglia. Di conseguenza, l'intera applicazione non può essere ridimensionata.
In origine, semplici negozi di valori-chiave distribuiti in memoria come Memcached e più tardi Redis è stato introdotto su piattaforme Unix/Linux per aiutare a risolvere questo problema di scalabilità. Sono diventati rapidamente molto popolari principalmente perché hanno fornito scalabilità lineare proprio come i livelli dell'applicazione e hanno rimosso il collo di bottiglia del database
NCache Dettagli NCache Docs NCache API client
Limitazioni nei negozi di valori chiave
Ma, nonostante la loro popolarità, queste soluzioni erano molto semplici, basilari in natura e non risolvevano davvero molti problemi che si presentavano nelle applicazioni della vita reale. Alcune delle aree in cui queste soluzioni erano molto deboli includevano:
- Mancanza di alta disponibilità
- Mancanza di modi intelligenti per mantenere la cache fresca
- Mancanza di query SQL
- Mancanza di codice di memorizzazione nella cache lato server (ad es. Read-through)
Ad esempio, l'elevata disponibilità era così scarsa Memcached che terze parti hanno iniziato a sviluppare "correzioni" ad alta disponibilità per esso. Ma l'architettura sottostante non è stata progettata per un'elevata disponibilità e quindi queste soluzioni sono rimaste di natura piuttosto limitata. Redis hanno avuto gli stessi problemi di disponibilità, ma in seguito hanno riprogettato il loro prodotto per incorporare alcune funzionalità di alta disponibilità come la replica dei dati e il supporto per il failover. Ma ci sono ancora grossi buchi in tutti i prodotti del negozio di valore chiave come Memcached ed Redis. È qui che le soluzioni di cache distribuita sono venute in soccorso.
Cache distribuita .NET come 2nd Generazione Key Value Store
Una cache distribuita .NET come NCache d'altra parte è stato progettato fin dal primo giorno per affrontare tutte le limitazioni sopra menzionate. Quindi, in sostanza, NCache è un 2nd Generazione ai negozi di valori chiave originali come Memcached ed Redis. NCache è una popolare cache distribuita di 10 anni per .NET.
Cluster di cache dinamica e replica dei dati
Una cache distribuita come NCache dispone di un cluster di cache dinamica con riparazione automatica che raggruppa tutte le risorse di memoria e CPU da tutti i server di cache nel cluster. Allo stesso tempo, NCache fornisce una varietà di topologie di memorizzazione nella cache con diverse strategie di distribuzione e replicazione dei dati. Questo permette NCache per scalare linearmente senza compromettere l'elevata disponibilità. E, anche se un server cache si arresta, non si verifica alcuna perdita di dati, il cluster di cache continua a funzionare e anche tutte le applicazioni che utilizzano la cache continuano senza interruzioni.
Mantenere la cache fresca
Un'altra area in cui piace una cache distribuita NCache brilla, sta mantenendo i dati freschi e sempre coerenti con il database. NCache lo fa attraverso una varietà di funzionalità tra cui Scadenze, guida di eventi Dipendenza Sql, DbDependency basato su polling e supporto per procedure CLR per banche dati relazionali. Le scadenze funzionano proprio come i negozi di valori chiave ma Dipendenza Sql e DbDependency consentono NCache per sincronizzare la cache con eventuali modifiche nel database per i dati correlati. E, Procedure memorizzate CLR consentono di aggiornare direttamente la cache dal database di SQL Server quando i dati corrispondenti cambiano.
Ciò significa che anche se un'applicazione di terze parti modifica i dati nel database, NCache si aggiorna immediatamente di conseguenza. Il vantaggio è che puoi memorizzare nella cache quasi tutti i dati dell'applicazione invece di memorizzare nella cache i dati di sola lettura, fornendo prestazioni migliori e aumento della scalabilità.
Ricerca nella cache con SQL
Quindi, quando sei in grado di memorizzare nella cache quasi tutti i tuoi dati grazie alle funzionalità "mantieni la cache fresca", riscontri il problema di non essere in grado di trovare facilmente i dati se l'unico meccanismo è il valore-chiave. Ma se potessi cercare i dati in base agli attributi, allora una cache distribuita come NCache diventa facile da cercare come un database. NCache ti fornisce SQL e query LINQ per questo scopo.
Oltre Interrogazione SQL in base agli attributi dell'oggetto, è possibile assegnare ATTIVITA' E GRUPPI, tage Tag con nome agli elementi memorizzati nella cache e includerli nelle query SQL. Di seguito è riportato un esempio di query SQL in C#. Per esempio:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using Alachisoft.NCache.Runtime; using Alachisoft.NCache.Runtime.Exceptions; using Alachisoft.NCache.Web.Caching; public void SearchDataUsingSQL() { Cache cache = NCache.InitializeCache("myparitionreplica"); string query = "SELECT this.Category, " + "MAX(Prod.Product.ProductID) " + "WHERE this.Category = ? " + "GROUP BY this.Category"; Hashtable values = new Hashtable(); values.Add("Category", 4); ICacheReader reader = cache.ExecuteReader(query, values); if (reader.FieldCount > 0) { while (reader.Read()) { //you can get value through the field name... object category = reader.GetOrdinal("Category"); //perform operations } } reader.Close(); return data; } |
Codice lato server
Infine, c'è un codice lato server come Lettura, Scrivere attraverso, Dipendenza personalizzatae Caricatore di cache e aggiornamento è molto utile. Questo codice è stato sviluppato dall'utente ma viene chiamato dalla cache distribuita e viene eseguito nel cluster di cache. Con l'aiuto di questo codice, puoi semplificare le tue applicazioni e spostare molto codice di uso comune nel livello di memorizzazione nella cache.
Per esempio, NCache chiama il tuo gestore Read-through quando l'applicazione richiede alcuni dati che non sono nella cache e l'applicazione lo dice NCache per chiamare Read-through in quel caso. Allo stesso modo, puoi combinare Read-through con scadenze e sincronizzazioni del database per ricaricare automaticamente l'elemento memorizzato nella cache invece di rimuoverlo dalla cache.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using Alachisoft.NCache.Runtime.Caching; using Alachisoft.NCache.Runtime.DatasourceProviders; using Alachisoft.NCache.Runtime.Dependencies; public class SampleReadThruProvider : IReadThruProvider { public void Init(IDictionary parameters, string cacheId) { // Create SQL connection and other initializations at the server side } //Responsible for loading an item from the external data source. public void LoadFromSource(string key, out ProviderCacheItem cacheItem) { //where LoadFromDataSource is the dummy method to load data from data source. object value = LoadFromDataSource(key); //Attach SQL dependency to your object string query = "SELECT ProductID FROM dbo.Products WHERE ProductID = 1001"; cacheItem = new ProviderCacheItem(value); cacheItem.Dependency = new SqlCacheDependency(connectionString, query); //Set expirations cacheItem.SlidingExpiration = new TimeSpan(0, 5, 0); //Indicates whether item should be reloaded on expiration if //ReadThru provider is specified. cacheItem.ResyncItemOnExpiration = true; } public void Dispose() { //... } } |
Il write-through funziona allo stesso modo del read-through ma per gli aggiornamenti. Aggiorna il tuo database quando la tua applicazione aggiorna la cache. E, se preferisci, Write-behind aggiorna il database in modo asincrono anche se la cache viene aggiornata in modo sincrono. Infine, Cache Loader viene chiamato all'avvio della cache in modo da poterla precaricare con i dati desiderati.
Conclusione
Come si può vedere, NCache, una cache distribuita .NET open source, offre molta più potenza alla tua cache rispetto a una semplice Redis negozio di valori-chiave o Memcached. Di seguito è riportato un confronto dettagliato dell'archivio dei valori chiave con un servizio di cache distribuita, ad es Redis vs NCache ed Memcached vs NCache.