Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 16824|Répondre: 0

[ASP.NET] Construis un cache de fichiers personnalisé ASP.NET optimiser les performances

[Copié le lien]
Publié sur 19/04/2015 22:06:12 | | | |
ASP.NET cache de sortie (c’est-à-dire HTML statique) était basée sur la mémoire jusqu’à .NET 4.0. Cela signifie que si notre site contient beaucoup de cache, il est facile de consommer de la mémoire locale. Maintenant, avec l’aide de . OutputCacheProvider dans .NET 4.0, nous avons plusieurs options pour créer notre propre cache. Par exemple, nous pouvons stocker le cache de sortie HTML dans un serveur cluster distribué à caches memcachées ou MongoDB (une base de données orientée document couramment utilisée, lisez ceci http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Bien sûr, nous pouvons aussi stocker le cache sous forme de fichier sur le disque dur, ce qui est la méthode la moins coûteuse compte tenu de la scalabilité, et cet article porte sur la façon de construire un cache de fichiers personnalisé.
1 :FournissCacheSortie
OutputCacheProvider est une classe de base abstraite dont nous devons outrepasser quatre de ses méthodes, à savoir :
Méthode Add pour insérer l’élément spécifié dans le cache de sortie.
Get, qui renvoie une référence à l’élément spécifié dans le cache de sortie.
Méthode de suppression pour retirer l’élément spécifié du cache de sortie.
set, insère l’élément spécifié dans le cache de sortie, et écrase l’élément s’il est mis en cache.
2 : Créez votre propre classe de gestion de la cache de fichiers
Le type est FileCacheProvider, et le code est le suivant :

  1. public class FileCacheProvider : OutputCacheProvider
  2. {
  3.     private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

  4.     public override void Initialize(string name, NameValueCollection attributes)
  5.     {
  6.         base.Initialize(name, attributes);
  7.         CachePath = HttpContext.Current.Server.MapPath(attributes["cachePath"]);
  8.     }

  9.     public override object Add(string key, object entry, DateTime utcExpiry)
  10.     {
  11.         Object obj = Get(key);
  12.         if (obj != null)    //这一步很重要
  13.         {
  14.             return obj;
  15.         }
  16.         Set(key,entry,utcExpiry);
  17.         return entry;
  18.     }

  19.     public override object Get(string key)
  20.     {
  21.         string path = ConvertKeyToPath(key);
  22.         if (!File.Exists(path))
  23.         {
  24.             return null;
  25.         }
  26.         CacheItem item = null;
  27.         using (FileStream file = File.OpenRead(path))
  28.         {
  29.             var formatter = new BinaryFormatter();
  30.             item = (CacheItem)formatter.Deserialize(file);
  31.         }

  32.         if (item.ExpiryDate <= DateTime.Now.ToUniversalTime())
  33.         {
  34.             log.Info(item.ExpiryDate + "*" + key);
  35.             Remove(key);
  36.             return null;
  37.         }
  38.         return item.Item;
  39.     }


  40.     public override void Set(string key, object entry, DateTime utcExpiry)
  41.     {
  42.         CacheItem item = new CacheItem(entry, utcExpiry);
  43.         string path = ConvertKeyToPath(key);
  44.         using (FileStream file = File.OpenWrite(path))
  45.         {
  46.             BinaryFormatter formatter = new BinaryFormatter();
  47.             formatter.Serialize(file, item);
  48.         }
  49.     }
  50.       
  51.     public override void Remove(string key)
  52.     {
  53.         string path = ConvertKeyToPath(key);
  54.         if (File.Exists(path))
  55.             File.Delete(path);
  56.     }

  57.     public string CachePath
  58.     {
  59.         get;
  60.         set;
  61.     }

  62.     private string ConvertKeyToPath(string key)
  63.     {
  64.         string file = key.Replace('/', '-');
  65.         file += ".txt";
  66.         return Path.Combine(CachePath, file);
  67.     }
  68. }

  69. [Serializable]
  70. public class CacheItem
  71. {
  72.     public DateTime ExpiryDate;
  73.     public object Item;

  74.     public CacheItem(object entry, DateTime utcExpiry)
  75.     {
  76.         Item = entry;
  77.         ExpiryDate = utcExpiry;
  78.     }
  79. }
Code de copie
Il y a deux endroits qui nécessitent une attention particulière :
Dans la méthode Addition, il y a un jugement conditionnel qui doit être géré de cette manière, sinon le mécanisme de mise en cache mettra en cache le premier résultat, et le cache expirera après la date d’expiration et ne sera pas reconstruit.
Dans le programme d’exemple, nous mettons simplement le cache dans le répertoire du cache, et en pratique réelle du projet, étant donné que les pages mises en cache seront des milliers, nous devons faire une classification des répertoires, sinon trouver et lire les fichiers cache deviendra un goulot d’étranglement d’efficacité, ce qui vide le CPU.
3 : Fichier de configuration

Nous devons configurer dans Web.config que le gestionnaire de cache soit un FileCacheProvider personnalisé, c’est-à-dire ajouter un nœud sous FileCacheProvider :
  1. <caching>
  2.   <outputCache defaultProvider="FileCache">
  3.     <providers>
  4.       <add name="FileCache" type="MvcApplication2.Common.FileCacheProvider" cachePath="~/Cache" />
  5.     </providers>
  6.   </outputCache>
  7. </caching>
Code de copie

4 : Utilisation du cache

Nous supposons que l’utiliser sous le contrôle de MVC (si vous souhaitez l’utiliser dans une page ASP.NET, incluez < % dans le page@OutputCache VaryByParam="none » Duration="10 » %>), et vous pouvez voir qu’Index n’est pas mis en cache en sortie, tandis qu’Index2 est mis en cache pendant 10 secondes.
  1. public class HomeController : Controller
  2. {
  3.     private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  4.     static string s_conn = "Data Source=192.168.0.77;Initial Catalog=luminjidb;User Id=sa;Password=sa;";
  5.     public ActionResult Index()
  6.     {
  7.         using (DataSet ds = Common.SqlHelper.ExecuteDataset(s_conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))
  8.         {
  9.             ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString();
  10.         }
  11.         return View();
  12.     }

  13.     [OutputCache(Duration = 10, VaryByParam = "none")]
  14.     public ActionResult Index2()
  15.     {
  16.         using (DataSet ds = Common.SqlHelper.ExecuteDataset(s_conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))
  17.         {
  18.             ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString();
  19.         }
  20.         return View();
  21.     }
  22. }
Code de copie
5 : Vérifie l’effet
Le code ci-dessus, après avoir accédé à Index2, générera un fichier cache dans le dossier Cache, comme suit :

Évaluons maintenant la comparaison de performance entre le cache de sortie et le cache de sortie, en simulant 100 requêtes concurrentes de 100 utilisateurs comme suit :








Précédent:Cycle de vie de Session
Prochain:C#. .NET pour prévenir les attaques d’injection SQL
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com