non ho mai provato ad aprire un topic anche da voi in italiano, proviamo :D
Benvenuto nel forum, ottima scelta!
in che modo posso "cachare", mettere nella cache i dati che la Google API mi restituisce
Usando il servizio IMemoryCache che trovi
documentato qui e di cui puoi ottenere un'istanza grazie alla dependency injection di ASP.NET Core.
Ecco un esempio in cui vedi due metodi:
- GetGoogleDataAsync che ottiene i dati usando sempre la Google API. È il metodo che hai già;
- GetCachedDataAsync è un nuovo metodo che dovrai creare e che si avvale del servizio IMemoryCache per prelevare i dati dalla cache. Se i dati non ci sono, perché ad esempio è la primissima richiesta o perché è trascorso un tempo limite, allora andrà a recuperarli da GetGoogleDataAsync, e poi li metterà in cache prima di restituirli al chiamante. Così, dalla seconda richiesta in poi, i risultati potranno essere tratti dalla cache.
Il chiamante ovviamente dovrà usare il metodo
GetCachedDataAsync. Se vuoi evitare abusi, rendi privato l'altro metodo
GetGoogleDataAsync.
private async Task<GoogleData> GetGoogleDataAsync()
{
GoogleData data = //TODO: qui metti la logica di ottenimento dei dati con Google API
return data;
}
public Task<GoogleData> GetCachedDataAsync()
{
string cacheKey = "GoogleApiData";
return memoryCache.GetOrCreateAsync(cacheKey, cacheEntry =>
{
cacheEntry.SetAbsoluteExpiration(TimeSpan.FromSeconds(60));
//Restituisco i dati ottenuti grazie alla Google API
return GetGoogleDataAsync();
});
}
Come vedi nell'esempio, ho chiamato il metodo
GetOrCreateAsync del servizio
IMemoryCache che si occuperà, in maniera atomica, di cercare il risultato nella cache e di invocare
GetGoogleDataAsync se non fosse trovato.
Il risultato resterà in cache per 60 secondi, grazie alla chiamata a
SetAbsoluteExpiration. Tu ovviamente hai facoltà di modificare questo tempo. Il servizio IMemoryCache è thread safe, quindi non teme parecchi accessi contemporanei: hai la garanzia che verrà fatta una richiesta con Google API al massimo una volta ogni 60 secondi.
La variabile
memoryCache è appunto l'istanza di
IMemoryCache ottenuta grazie alla dependency injection. Sai cos'è la dependency injection e come sfruttarla?
ciao,
Moreno
Modificato da BrightSoul il 04 settembre 2019 13:38 -