J'ai un site ASP.NET avec une fonction de recherche assez lente, et je veux améliorer les performances en ajoutant les résultats au cache pendant une heure en utilisant la requête comme clé de cache:Effectuer le verrouillage dans ASP.NET correctement
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!";
}
}
Supposons que le visiteur A effectue une recherche. Le cache est vide, le verrou est défini et le résultat est demandé dans la base de données. Maintenant, le visiteur B vient avec une recherche différente: le visiteur B ne devra-t-il pas attendre à la serrure jusqu'à ce que la recherche du visiteur A soit terminée? Ce que je voulais vraiment, c'est que B appelle immédiatement la base de données, car les résultats seront différents et la base de données pourra gérer plusieurs requêtes - je ne veux tout simplement pas répéter des requêtes inutiles coûteuses.
Quelle serait la bonne approche pour ce scénario?
-ce que les requêtes vraiment si cher et/ou votre site si occupé que vous ne pouvez pas se permettre quelques redondantes requêtes en double une fois par heure? (Et cette situation ne se produirait que si deux ou plusieurs requêtes atteignaient votre méthode presque simultanément une fois le cache expiré.) – LukeH
Si votre base de données ne prend pas en charge l'accès en lecture multiple, vous pouvez implémenter une requête de message. A, alors DB sert B ... tout en servant, vérifiez le cache. – Winfred
@LukeH, Il y a tellement de choses dans cette base de données particulière, donc toute charge que nous pouvons enlever en vaut la peine. –