Tengo un sitio ASP.NET con una función de búsqueda bastante lenta, y quiero mejorar el rendimiento añadiendo los resultados al caché durante una hora usando la consulta como clave de caché:Realizando el bloqueo en ASP.NET correctamente
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!";
}
}
Digamos que el visitante A hace una búsqueda. La memoria caché está vacía, se establece el bloqueo y se solicita el resultado de la base de datos. Ahora el visitante B viene con una búsqueda diferente: ¿No tendrá que esperar el visitante B hasta que se complete la búsqueda del visitante A? Lo que realmente quería era que B llamara a la base de datos de inmediato, porque los resultados serán diferentes y la base de datos puede manejar múltiples solicitudes; simplemente no quiero repetir costosas consultas innecesarias.
¿Cuál sería el enfoque correcto para este escenario?
son las consultas realmente tan caros y/o su sitio tan ocupado que no puede permitirse unos pocos consultas duplicadas redundantes una vez por hora? (Y esa situación solo surgiría si, y solo si, dos o más consultas llegan a su método casi simultáneamente una vez que la memoria caché ha expirado). – LukeH
Si su base de datos no admite múltiples accesos de lectura, puede implementar una consulta de mensaje, de modo que DB sirve A, luego DB sirve B ... mientras sirve, revisa el caché. – Winfred
@LukeH, están pasando muchas cosas en esa base de datos en particular, por lo que cualquier carga que podamos sacar vale la pena. –