Ho un sito ASP.NET con una funzione di ricerca abbastanza lenta e voglio migliorare le prestazioni aggiungendo i risultati alla cache per un'ora utilizzando la query come chiave di cache:Effettuare il blocco in ASP.NET correttamente
using System;
using System.Web;
using System.Web.Caching;
public class Search
{
private static object _cacheLock = new object();
public static string DoSearch(string query)
{
string results = "";
if (HttpContext.Current.Cache[query] == null)
{
lock (_cacheLock)
{
if (HttpContext.Current.Cache[query] == null)
{
results = GetResultsFromSlowDb(query);
HttpContext.Current.Cache.Add(query, results, null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
}
else
{
results = HttpContext.Current.Cache[query].ToString();
}
}
}
else
{
results = HttpContext.Current.Cache[query].ToString();
}
return results;
}
private static string GetResultsFromSlowDb(string query)
{
return "Hello World!";
}
}
Diciamo che il visitatore A esegue una ricerca. La cache è vuota, il blocco è impostato e il risultato è richiesto dal database. Ora il visitatore B arriva con una ricerca diversa: il visitatore B non dovrà aspettare per il blocco finché la ricerca del visitatore A non sarà completata? Quello che volevo era che B chiamasse immediatamente il database, perché i risultati sarebbero diversi e il database in grado di gestire più richieste - semplicemente non voglio ripetere costose query non necessarie.
Quale sarebbe l'approccio corretto per questo scenario?
sono le interrogazioni davvero così costosi e/o il vostro sito così occupato che non può permettersi un paio di query duplicate ridondanti una volta all'ora? (E questa situazione si verifica solo se, e solo se, due o più query colpiscono il metodo quasi simultaneamente una volta scaduta la cache.) – LukeH
Se il database non supporta più accessi in lettura, è possibile implementare una query di messaggio, quindi DB serve A, quindi DB serve B ... mentre serve, controlla la cache. – Winfred
@LukeH, C'è così tanto da fare in quel particolare database, quindi ogni carico che possiamo rimuoverlo vale lo sforzo. –