Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 16824|Odgovoriti: 0

[ASP.NET] Ustvarite prilagojen predpomnilnik datotek ASP.NET optimizacijo zmogljivosti

[Kopiraj povezavo]
Objavljeno na 19. 04. 2015 22:06:12 | | | |
ASP.NET predpomnjenje izhodov (tj. statični HTML) je temeljilo na pomnilniku do .NET 4.0. To pomeni, da če naša stran vsebuje veliko predpomnilnika, je enostavno porabiti lokalni pomnilnik. Zdaj, s pomočjo . OutputCacheProvider v .NET 4.0 imamo več možnosti za ustvarjanje lastnega predpomnilnika. Na primer, HTML izhodni predpomnilnik lahko shranimo v memcached distributed cluster server ali MongoDB (pogosto uporabljena dokumentno usmerjena podatkovna baza, beri ta http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Seveda lahko predpomnilnik shranimo tudi kot datoteko na trdi disk, kar je najcenejši način glede na razširljivost, ta članek pa govori o tem, kako zgraditi prilagojen predpomnilnik datotek.
1:OutputCacheProvider
OutputCacheProvider je abstraktni osnovni razred, za katerega moramo preglasiti štiri njegove metode, in sicer:
Dodajte metodo za vstavljanje določenega elementa v izhodni predpomnilnik.
Get method, ki vrne referenco na določen element v izhodnem predpomnilniku.
Odstrani metodo za odstranitev določenega elementa iz izhodnega predpomnilnika.
Metoda nastavitve, vstavlja določen element v izhodni predpomnilnik in ga prepiše, če je predpomnjen.
2: Ustvarite svoj razred za upravljanje predpomnjenja datotek
Tip je FileCacheProvider, koda pa je naslednja:

  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. }
Kopiraj kodo
Obstajata dve mesti, ki potrebujeta posebno pozornost:
Pri metodi Add je treba na ta način obdelovati pogojno presojo, sicer bo mehanizem predpomnilnika shranil prvi rezultat, predpomnilnik pa bo potekel po datumu poteka in ga ni mogoče ponovno sestaviti.
V primeru programa preprosto postavimo predpomnilnik v mapo predpomnilnika, in v dejanski praksi projekta, glede na to, da bo predpomnjenih strani na tisoče, moramo izvesti klasifikacijo imenikov, sicer bo iskanje in branje datotek predpomnilnika postalo ozko grlo za učinkovitost, kar bo izčrpalo procesor.
3: Konfiguracijska datoteka

V Web.config moramo konfigurirati, da je upravljalnik predpomnilnika prilagojen FileCacheProvider, torej dodati vozlišče pod 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>
Kopiraj kodo

4: Uporaba predpomnilnika

Predvidevamo, da če ga uporabljate v nadzoru MVC (če ga želite uporabiti na ASP.NET strani, vključite < % v page@OutputCache VaryByParam = "none" Trajanje="10" %>), in lahko vidite, da Index ni predpomnjen, medtem ko je Index2 predpomnjen 10 sekund.
  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. }
Kopiraj kodo
5: Preverite učinek
Zgornja koda, po dostopu do Index2, bo ustvarila datoteko predpomnilnika v mapi Predpomnilnik, kot sledi:

Zdaj ocenimo primerjavo zmogljivosti med izhodnim in izhodnim predpomnilnikom, pri čemer simuliramo 100 sočasnih zahtevkov od 100 uporabnikov na naslednji način:








Prejšnji:Življenjski cikel seje
Naslednji:C#. .NET za preprečevanje napadov z SQL injekcijami
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com