Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 16824|Antwoord: 0

[ASP.NET] Bouw een aangepaste bestandscache ASP.NET prestatieoptimalisatie

[Link kopiëren]
Geplaatst op 19-04-2015 22:06:12 | | | |
ASP.NET uitvoercaching (d.w.z. statische HTML) was geheugengebaseerd tot .NET 4.0. Dit betekent dat als onze site veel cache bevat, het gemakkelijk is om lokaal geheugen te gebruiken. Nu, met behulp van . OutputCacheProvider in .NET 4.0, we hebben verschillende opties om onze eigen cache te maken. We kunnen bijvoorbeeld de HTML-uitvoercache opslaan in een memcached gedistribueerd clusterserver of MongoDB (een veelgebruikte documentgeoriënteerde database, lees dit http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Natuurlijk kunnen we de cache ook als bestand op de harde schijf opslaan, wat de goedkoopste manier is gezien schaalbaarheid, en dit artikel gaat over hoe je een aangepaste bestandscache bouwt.
1:OutputCacheProvider
OutputCacheProvider is een abstracte basisklasse waarbij we vier van zijn methoden moeten overschrijven, namelijk:
Voeg methode toe om het gespecificeerde item in de output cache te plaatsen.
Get-methode, die een referentie teruggeeft naar het opgegeven item in de outputcache.
Remove methode om het opgegeven item uit de output cache te verwijderen.
Set method, voegt het opgegeven item in de outputcache en overschrijft het item als het gecachet is.
2: Maak je eigen file caching handling class aan
Het type is FileCacheProvider, en de code is als volgt:

  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 kopiëren
Er zijn twee plekken die speciale aandacht verdienen:
In de Add-methode is er een voorwaardelijk oordeel dat op deze manier moet worden afgehandeld, anders zal het cachingmechanisme het eerste resultaat cachen, en de cache verloopt na de vervaldatum en wordt niet opnieuw opgebouwd.
In het voorbeeldprogramma plaatsen we simpelweg de cache in de cachemap, en in de praktijk van het project, aangezien de gecachte pagina's duizenden zullen zijn, moeten we directoryclassificatie uitvoeren, anders wordt het vinden en lezen van cachebestanden een efficiëntiebottleneck die de CPU uitputt.
3: Configuratiebestand

We moeten in Web.config configureren dat de cachehandler een aangepaste FileCacheProvider is, oftewel een node toevoegen onder 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 kopiëren

4: Gebruik van cache

We gaan ervan uit dat het gebruik ervan in MVC's control (als je het in een ASP.NET pagina wilt gebruiken, neem dan <% op in de page@OutputCache VaryByParam="none" Duur="10" %>), en je kunt zien dat Index niet wordt gecachet, terwijl Index2 10 seconden wordt gecachet.
  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 kopiëren
5: Controleer het effect
De bovenstaande code zal, na het openen van Index2, een cachebestand genereren in de Cache-map, als volgt:

Laten we nu de prestatievergelijking tussen de outputcache en de outputcache evalueren, waarbij we 100 gelijktijdige verzoeken van 100 gebruikers als volgt simuleren:








Vorig:De levenscyclus van de sessie
Volgend:C#. .NET om SQL-injectieaanvallen te voorkomen
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com