La memorizzazione nella cache distribuita è diventata un modo popolare per migliorare le prestazioni e la scalabilità delle applicazioni .NET. Ecco perché gli sviluppatori memorizzano nella cache sempre più dati nella cache distribuita. Tuttavia, insieme a questo, arrivano alcune sfide. Una sfida importante è garantire che i dati nella cache siano sempre sincronizzati con il database. Questo perché la cache conserva una copia dei dati già esistenti nel database.
Se hai più applicazioni che aggiornano gli stessi dati nel database ma non tutte hanno accesso alla cache distribuita, ti ritroverai con una situazione in cui i dati nella cache sono più vecchi e diversi dalla loro controparte nel database. E, sebbene questo possa andare bene per alcuni tipi di dati di riferimento, non è assolutamente accettabile per i dati transazionali. I dati di riferimento sono quelli che leggi molto ma non modifichi molto frequentemente (es. catalogo prodotti) mentre i dati transazionali sono qualcosa che leggi e modifichi frequentemente (es. dati cliente o account).
NCache Dettagli Documenti di dipendenza dalla cache NCache Docs
Come ci si assicura che la cache distribuita rimanga sincronizzata con il database?
La risposta è SqlCacheDependency
. Fa parte di ASP.NET Cache (System.Web.Caching) e consente di specificare un set di dati nel database con un'istruzione SQL e quindi ricevere notifiche di eventi .NET da SQL Server 2005/2008 ogni volta che il set di dati viene modificato nel database .
NCache ha incorporato internamente SqlCacheDependency
ai fini della sincronizzazione della cache con SQL Server 2005/2008 o database Oracle. A te, NCache fornisce un'interfaccia simile chiamata SqlDependency che consente di specificare un'istruzione SQL che rappresenta una o più righe in una determinata tabella che costituiscono l'elemento memorizzato nella cache. NCache quindi utilizza internamente SqlCacheDependency
per stabilire un collegamento con il database rispetto a queste righe.
Quindi, se i tuoi dati vengono aggiornati nel database da una delle tue applicazioni, SQL Server genera una notifica di evento .NET che NCache cattura e rimuove l'elemento corrispondente dalla cache distribuita. Ciò risolve il problema dell'incoerenza dei dati di avere due copie diverse degli stessi dati. Questo perché quando la tua applicazione desidera gli stessi dati la prossima volta, non li trova nella cache ed è obbligata a recuperare l'ultima copia dal database che poi memorizza nella cache. Per di qua, NCache assicura che i dati nella cache siano sempre coerenti con i dati nel database.
Ecco un esempio di codice sorgente dell'utilizzo di SqlDependency di NCache che internamente utilizza SqlCacheDependency
:
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
public class Program { // A standard Load method that loads a single row from database public Customer LoadCustomer(Customer cust) { String key = "Customer:CustomerID:" + cust.CustomerID; Customer cust2 = (Customer)NCache.Cache.Get(key); if (cust2 != null) return cust2; CustomerFactory custFactory = new CustomerFactory(); // Load a single customer from the database // SELECT * FROM Customers WHERE CustomerID = 'ALFKI' custFactory.Load(cust); // Create a SqlCacheDependency for this item CacheItem item = new CacheItem(cust); item.Dependency = SqlDependencyFactory(connectionString, "SELECT CustomerID FROM Customers WHERE CustomerID = '" + cust.CustomerID + "'"); // Store item in the cache along with SqlCacheDependency NCache.Cache.Insert(key, item); return cust; } // A query method public List<Customer> FindCustomers(String city) { String key = "List<Customer>:City:" + city; List<Customer> custList = (List<Customer>)NCache.Cache.Get(key); if (custList != null) return custList; CustomerFactory custFactory = new CustomerFactory(); // Load a list of customers from database based on a criteria // SELECT * FROM Customers WHERE City = 'San Francisco' custList = custFactory.FindByCity(city); // Create a SqlCacheDependency for this list of customers CacheItem item = new CacheItem(custList); item.Dependency = SqlDependencyFactory.(connectionString, "SELECT CustomerID FROM Customers WHERE City = '" + city + "'"); // Store list of customers in the cache along with SqlCacheDependency NCache.Cache.Insert (key, item); return custList; } } |
Dipendenza della cache da SQL Dipendenza dalla cache di Oracle DB Dipendenza cache personalizzata
In sintesi, la funzionalità SqlDependency di NCache consente di sincronizzare la cache con il database e mantenere l'integrità dei dati. Ora puoi iniziare a memorizzare nella cache tutti i dati senza il timore di utilizzare i dati non aggiornati dalla cache. E, naturalmente, più dati memorizzi nella cache, migliori saranno le prestazioni e la scalabilità delle tue applicazioni.
Quindi, scarica una versione di prova di 60 giorni completamente funzionante di NCache Enterprise e provalo tu stesso.