Con il tempo, la memorizzazione nella cache distribuita sta diventando popolare in quanto migliora le prestazioni delle applicazioni e fornisce scalabilità. E con la necessità di un metodo veloce e scalabile, le persone memorizzano sempre più dati nella cache. Maggiori sono le prestazioni dell'applicazione, maggiore è il numero di applicazioni client. Tuttavia, esiste un'alta probabilità che il database e la cache non siano sincronizzati quando più client posizionano e recuperano i dati da e verso l'origine dati. Per contrastare questo problema, la maggior parte delle persone utilizza una tecnica di scadenza dei dati chiamata time to live (TTL) o Scadenza assoluta. Questa scadenza rimuove automaticamente l'elemento della cache specificato dopo il tempo specificato. Sebbene sia popolare, questo meccanismo è un'ipotesi plausibile su quanto tempo i dati rimangono invariati nella cache.
Se sei sicuro che i tuoi dati non cambieranno probabilmente in questa durata, o i tuoi dati non sono molto sensibili, il che significa che puoi permetterti di leggere i vecchi dati obsoleti dalla cache, allora puoi usare scadenza. Ma se i tuoi dati sono sensibili all'attività e non puoi permetterti di leggere dati imprecisi dalla cache, i dati obsoleti ti costeranno molto. In questa situazione, l'accesso a dati obsoleti è un rischio da non correre.
NCache Dettagli Tipi di scadenza dei dati NCache Docs
Sincronizzazione NCache con SQL Server
Per evitare la situazione sopra indicata che si verifica nella tua applicazione .NET, devi assicurarti che la tua cache sia sempre sincronizzata con il database. E proprio per questo scopo, NCache fornisce una funzione di sincronizzazione del database chiamata Dipendenza SQL che ti consente di mantenere la tua cache sincronizzata con il database di SQL Server. La dipendenza SQL utilizza le notifiche di query per sincronizzare la cache con il database se si verificano modifiche nei set di dati.
NCache Dettagli Dipendenza SQL NCache Docs
Query Notifiche in SQL Server
Le notifiche di query sono una funzionalità di SQL Server che notifica a tutti i client di database quando un set di dati viene modificato nel database. NCache Il server utilizza questa funzionalità per diventare un client SQL Server e per registrarsi con SQL Server tramite SQL Dependency.
In questo modo, SQL Server notifica NCache quando dati specifici cambiano nel database. E NCache mantiene una mappatura degli elementi memorizzati nella cache e dei corrispondenti set di dati del database. Con questo, NCache può invalidare l'elemento memorizzato nella cache, quindi una nuova copia viene recuperata dal database la prossima volta che l'applicazione ne ha bisogno.
NCache fornisce l'API di dipendenza SQL tramite la sua API client. Tuttavia, è necessario fornire i seguenti parametri tramite questa API quando si aggiungono elementi memorizzati nella cache a NCache.
- Stringa di connessione: per stabilire una connessione con il database.
- CommandText: per determinare il CommandText utilizzato dalla dipendenza.
NCache Dettagli Dipendenza SQL Configurare l'ambiente di SQL Server
Sincronizza NCache con SQL Server: un rapido esempio
Supponiamo che tu disponga di un sistema di acquisti online basato su .NET con una gamma di articoli ricercabili accessibili da centinaia di clienti contemporaneamente. Il portale dello shopping apre il giorno di Natale con uno sconto del 40% sull'intero stock. Il server delle applicazioni aggiorna il prezzo unitario dei prodotti nel database mentre la cache non è a conoscenza di questa modifica.
Se i client accedono agli elementi dalla cache, la copia più vecchia di questi elementi, senza sconti, rimane disponibile. Quando i clienti cercano prodotti, ottengono i vecchi prezzi unitari di Natale, con il risultato che i clienti diventano frustrati e insoddisfatti dell'attività.
Ma se usi il NCache funzione di sincronizzazione del database con il server SQL, l'utente può abilitare le notifiche per mantenere i dati sincronizzati con il database per ogni aggiornamento. In questo caso, l'applicazione non deve affrontare questo problema di integrità dei dati poiché la cache ha sempre i dati corretti.
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 |
// Creating connection string to get connected with database. string connectionString = "Server=SERVERNAME; Database=NORTHWIND; UserId=USERID; Password=PASSWORD;"; // Getting products from database. List products = FetchProductFromDB(); // Creating dictionary of CacheItems. Dictionary<string, CacheItem> cacheItems = new Dictionary<string, CacheItem>(); foreach(Product product in products) { string productKey = $"Product: {product.ProductID}"; // Creating an SQL dependency on the unit price of product. Whenever the Unitprice changes, the product is removed from the cache. string query = $"Select UnitPrice from dbo.Products where ProductID = {product.ProductID}"; // Creating dependency on all the products. SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query); CacheItem productItem = new CacheItem(product); // Adding Dependency to product item productItem.Dependency = dependency; } // Adding CacheItems in cache cache.Add(productKey, productItem); |
Il motivo per cui dovresti usare il NCache SqlCacheDependency Il metodo per sincronizzare i dati con il server SQL è semplice. I tuoi dati della cache non diventano mai obsoleti e puoi inserire con sicurezza tutti i tipi di dati e recuperarli senza affrontare problemi di integrità dei dati.
NCache Dettagli SqlCacheDependency NCache Docs
Ricarica automaticamente l'elemento della cache tramite il provider ReadThru
Invece di invalidare un elemento memorizzato nella cache, se vuoi che la cache lo ricarichi automaticamente quando i suoi dati corrispondenti cambiano nel database, devi implementare il IReadThruProvider interfaccia in NCache. Ora, ogni volta NCache riceve una notifica di aggiornamento da SQL Server invece di rimuovere quell'elemento dalla cache, NCache chiama il provider ReadThru per recuperare i dati aggiornati dal database.
Aggiungi la seguente riga di codice prima di inserire i dati nella cache e NCache gestisce la sincronizzazione automatica dei dati per te.
1 2 3 4 5 6 7 8 9 |
// Create a new cache item and add sql dependency to it CacheItem item = new CacheItem(product); item.Dependency = sqlDependency; // Resync if enabled, will automatically resync cache with SQL server item.ResyncOptions = new ResyncOptions(true); // Add cache item in the cache with SQL Dependency and Resync option enabled cache.Insert(key, item); |
NCache Dettagli Read-through dei fornitori di origini dati NCache Docs
Query parametrizzate nelle dipendenze SQL
Troppe modifiche nel database richiedono l'invalidazione frequente degli elementi memorizzati nella cache. Per ogni invalidazione dei dati, è necessario fornire una query SELECT. Ciò significa che SQL Server deve compilare questa query SQL prima di eseguirla. Ciò provoca un degrado delle prestazioni poiché la compilazione delle query richiede molto tempo.
Per risolvere questo problema di prestazioni, NCache consente di utilizzare query SQL con parametri in cui si specificano i valori dei parametri in fase di esecuzione e questi valori cambiano a ogni esecuzione. Qui, la query SQL stessa viene compilata alla prima esecuzione e non necessita più di ricompilazione, e questo fa risparmiare molto tempo e migliora le prestazioni.
Per utilizzare query con parametri nella tua applicazione, invece di scrivere una normale query di selezione, implementa la seguente query.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Creating Param to be passed in stored procedure dictionary. SqlCmdParams paramProductID = new SqlCmdParams { Type = CmdParamsType.Int, Value = product.ProductID }; // Creating stored procedure params. Dictionary<string, SqlCmdParams> parameter = new Dictionary<string, SqlCmdParams>(); parameters.Add("@ProductID", paramProductID); CacheItem productItem = new CacheItem(product); /*Creating an SQL dependency on the unit price of the product. Whenever the unit price changes, the product is removed from the cache*/ SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query, SqlCommandType.Text, parameters); // Adding Dependency to the product item productItem.Dependency = dependency; cache.Add(productKey, productItem); |
NCache Dettagli SqlCacheDependency SqlCacheDependency
Dipendenza SQL basata su stored procedure
Molte organizzazioni preferiscono mantenere tutte le loro query SQL utilizzate dalle loro applicazioni all'interno del loro database sotto forma di stored procedure. Ciò migliora le prestazioni perché tutte queste procedure memorizzate sono precompilate ed eseguite molto più velocemente rispetto alle query SQL dinamiche. In secondo luogo, possono mantenere tutte le query SQL di accesso al database in un unico posto e non sparse all'interno di ciascuna applicazione, il che è difficile da modificare se desiderano aggiornare le proprie query SQL.
Per queste organizzazioni, NCache supporta la dipendenza SQL basata su procedura memorizzata dove invece di specificare una query SQL dinamica o persino una query SQL parametrizzata, è possibile specificare una chiamata a procedura memorizzata.
La seguente query SQL crea una procedura con ProductID come parametro. Questa stored procedure può essere utilizzata nell'applicazione per sincronizzare la cache con il database.
1 2 3 4 |
create PROCEDURE sp_GetUnitPriceByProductID @ProductID int as Select UnitPrice from dbo.Products where ProductID = @ProductID; |
Per chiamare questa stored procedure nell'applicazione .NET, utilizzare il frammento di codice seguente.
1 2 3 4 5 6 7 8 9 10 11 |
// Specifying stored procedure, created in database. string spGetUnitPriceByProductID = "sp_GetUnitPriceByProductID"; /*Creating an SQL dependency on the unit price of product. Whenever the unitprice changes, the product is removed from the cache*/ SqlCacheDependency dependency = new SqlCacheDependency(connectionString, spGetUnitPriceByProductID, SqlCommandType.StoredProcedure, parameters); // Adding Dependency to product item productItem.Dependency = dependency; cache.Add(productKey, productItem); |
NCache Dettagli Procedura di archiviazione Query SQL
Conclusione
Se non utilizzi NCache come origine dati primaria per un'applicazione basata su ASP.NET, inizia a usarla ora come:
- NCache è una soluzione in-memory che non richiede alcuna interferenza da parte del client per ribilanciare automaticamente i dati, rendendo la tua applicazione estremamente flessibile.
- Ti consente di aggiungere tutti i server che desideri in fase di esecuzione, fornendoti la soluzione più scalabile per la tua applicazione .NET.
Se disponi di un'applicazione ASP.NET, ma il database che stai utilizzando non supporta le notifiche, NCache fornisce un metodo chiamato dipendenza basata sui sondaggi.