In uno script precedente (https://www.aspitalia.com/script/1249/Sfruttare-Redis-Cache-ASP.NET-Core.aspx) ci siamo occupati del supporto alla cache distribuita in ASP.NET Core, e abbiamo visto come esista un provider che renda estremamente immediato l'utilizzo di Redis Cache.
Non sempre, però, abbiamo a disposizione un cluster di Redis Cache, per esempio perché la nostra azienda non è ancora pronta a sfruttare Microsoft Azure e siamo ancora in uno scenario on-premises. Tuttavia, magari, siamo comunque in un contesto di Web Farm, ossia abbiamo più server in load balancing che servono il nostro sito; o, ancora, vogliamo condividere la cache tra due applicazioni distinte, come un front-end e un sito di back office.
In tutti questi casi, una cache distribuita apporta ancora notevoli benefici prestazionali e, in assenza di Redis Cache, possiamo sfruttare un database SQL Server condiviso per memorizzarne le chiavi. Tipicamente, si tratterà di un database differente da quello in cui vengono memorizzati i dati applicativi veri e propri, così da non impattare nelle prestazioni di quest'ultimo e mantenere questi due componenti dell'infrastruttura ben distinti.
Il primo passo è quello di installare i due package NuGet necessari:
Install-Package Microsoft.Extensions.Caching.SqlServer Install-Package Microsoft.Extensions.Caching.SqlConfig.Tools
Il primo contiene le vere e proprie librerie che andremo a utilizzare, mentre il secondo estende il tool a riga di comando DotNet CLI con un comando per creare la tabella sul database. Occupiamoci subito di quest'ultimo task, aprendo un prompt dei comandi e digitando:
dotnet sql-cache create "..connection string al database.." dbo CacheData
I tre parametri sono rispettivamente:
- la connection string per il database
- lo schema da utilizzare, nel nostro caso dbo
- il nome della tabella con le chiavi di cache
Il risultato sarà una nuova tabella nel database, come quella in figura:
A questo punto siamo pronti per configurare il provider di cache in ASP.NET Core. Come al solito, sfrutteremo il metodo ConfigureServices della classe Startup:
public void ConfigureServices(IServiceCollection services) { // .. altre configuraiozioni qui services.AddDistributedSqlServerCache(cfg => { cfg.ConnectionString = Configuration.GetConnectionString("cachedb"); cfg.SchemaName = "dbo"; cfg.TableName = "CacheData"; }); }
I parametri sono sostanzialmente gli stessi che abbiamo utilizzato in precedenza. Questo metodo inietta un nuovo provider per l'interfaccia IDistributedCache, che possiamo sfruttare in maniera assolutamente analoga a quanto visto nel caso di Redis Cache. Il codice per sfruttare la cache in un controller resta, infatti, esattamente il medesimo:
public class HomeController : Controller { private IDistributedCache _cache; public HomeController(IDistributedCache cache) { _cache = cache; } public async Task<IActionResult> Index() { var currentDate = await _cache.GetStringAsync("currentDate"); if (currentDate == null) { currentDate = DateTime.Now.ToString(); await _cache.SetStringAsync("currentDate", currentDate, new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10) }); } ViewBag.CurrentDate = currentDate; return View(); } }
Si tratta di uno dei grandi vantaggi del programmare per astrazioni: l'implementazione concreta di IDistributedCache sarà sensibilmente differente, ma non dovremo effettuare alcuna manutenzione sul codice applicativo.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Migrare una service connection a workload identity federation in Azure DevOps
Eseguire attività basate su eventi con Azure Container Jobs
Creare moduli CSS in React
Utilizzare la libreria Benchmark.NET per misurare le performance
Ottenere il contenuto di una cartella FTP con la libreria FluentFTP
Specificare il versioning nel path degli URL in ASP.NET Web API
C# 12: Cosa c'è di nuovo e interessante
Load test di ASP.NET Core con k6
Paginare i risultati con QuickGrid in Blazor
Utilizzare database e servizi con gli add-on di Container App
Come EF 8 ha ottimizzato le query che usano il metodo Contains
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
I più letti di oggi
- annunciato #netstandard 2.1. .NET Core lo supporterà a partire da #netcore3, così come le prossime versione di #xamarin, #mono e #unity.il supporto per #netfx 4.8, invece, non ci sarà. https://aspit.co/bq2
- Annunciato Silverlight 4 RC e Windows Phone Developer Tools
- Speciale Razor: il nuovo view engine di WebMatrix e ASP.NET MVC
- Speciale Windows Store app: costruire app con WinRT per Windows 8
- Gestire lo stato all'interno di un class component di ReactJS
- Inserimenti bulk su database con la classe SqlBulkCopy di ADO.NET 2.0
- disponibile su MSDN la versione RTM di #VS2013 Update 2! https://aspit.co/auj #msTechEd