Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 16824|Antwort: 0

[ASP.NET] Erstellen Sie einen benutzerdefinierten Dateicache ASP.NET Performance-Optimierung

[Link kopieren]
Veröffentlicht am 19.04.2015 22:06:12 | | | |
ASP.NET Ausgabe-Caching (d. h. statisches HTML) war bis zu .NET 4.0 speicherbasiert. Das bedeutet, wenn unsere Seite viel Cache enthält, ist es einfach, lokalen Speicher zu verbrauchen. Jetzt, mit Hilfe von . OutputCacheProvider in .NET 4.0, wir haben mehrere Möglichkeiten, unseren eigenen Cache zu erstellen. Zum Beispiel können wir den HTML-Ausgabe-Cache in einem memcached verteilten Cluster-Server oder in MongoDB speichern (eine häufig verwendete dokumentorientierte Datenbank, lesen Sie dies http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Natürlich können wir den Cache auch als Datei auf der Festplatte speichern, was unter Berücksichtigung der Skalierbarkeit der günstigste Weg ist, und dieser Artikel behandelt, wie man einen benutzerdefinierten Dateicache erstellt.
1:OutputCacheProvider
OutputCacheProvider ist eine abstrakte Basisklasse, bei der wir vier ihrer Methoden überschreiben müssen, nämlich:
Fügen Sie die Methode hinzu, um das angegebene Element in den Ausgabe-Cache einzufügen.
Get-Methode, die eine Referenz auf das angegebene Element im Ausgabecache zurückgibt.
Remove Methode, um das angegebene Element aus dem Ausgabe-Cache zu entfernen.
set-Methode, fügt das angegebene Element in den Ausgabecache ein und überschreibt das Element, falls es zwischengespeichert ist.
2: Erstellen Sie Ihre eigene Datei-Caching-Verarbeitungsklasse
Der Typ ist FileCacheProvider, und der Code lautet wie folgt:

  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 kopieren
Es gibt zwei Bereiche, die besondere Aufmerksamkeit benötigen:
In der Add-Methode gibt es ein bedingtes Urteil, das auf diese Weise behandelt werden muss, andernfalls speichert der Caching-Mechanismus das erste Ergebnis und der Cache verfällt nach dem Ablaufdatum und wird nicht wieder aufgebaut.
Im Beispielprogramm legen wir den Cache einfach ins Cache-Verzeichnis, und in der tatsächlichen Projektpraxis, da die zwischengespeicherten Seiten tausend sind, müssen wir eine Verzeichnisklassifikation durchführen, sonst wird das Finden und Lesen von Cache-Dateien zu einem Effizienz-Engpass, der die CPU erschöpft.
3: Konfigurationsdatei

Wir müssen in Web.config so konfigurieren, dass der Cache-Handler ein benutzerdefinierter FileCacheProvider ist, also einen Knoten unter FileCacheProvider hinzufügen:
  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 kopieren

4: Nutzung des Caches

Wir gehen davon aus, dass die Nutzung in MVC's Control (wenn Sie es auf einer ASP.NET Seite verwenden möchten, fügen Sie <% in die page@OutputCache VaryByParam="none" Duration="10" %>) an, und Sie sehen können, dass Index nicht zwischengespeichert wird, während Index2 für 10 Sekunden ausgegeben wird.
  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 kopieren
5: Überprüfen Sie den Effekt
Der obige Code erzeugt nach dem Zugriff auf Index2 eine Cache-Datei im Cache-Ordner wie folgt:

Nun evaluieren wir den Leistungsvergleich zwischen dem Output-Cache und dem Output-Cache und simulieren 100 gleichzeitige Anfragen von 100 Nutzern wie folgt:








Vorhergehend:Lebenszyklus der Sitzung
Nächster:C#. .NET, um SQL-Injektionsangriffe zu verhindern
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com