Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 16824|Vastaus: 0

[ASP.NET] Rakenna mukautettu tiedostovälimuisti suorituskyvyn optimoinnin ASP.NET

[Kopioi linkki]
Julkaistu 19.4.2015 22.06.12 | | | |
ASP.NET tulostusvälimuisti (eli staattinen HTML) perustui muistiin aina .NET 4.0:aan asti. Tämä tarkoittaa, että jos sivustollamme on paljon välimuistia, paikallismuistin kuluttaminen on helppoa. Nyt, avustuksella . OutputCacheProviderissa .NET 4.0:ssa meillä on useita vaihtoehtoja oman välimuistin luomiseen. Esimerkiksi voimme tallentaa HTML-tulostusvälimuistin memcache-hajautettuun klusteripalvelimeen tai MongoDB:hen (yleisesti käytetty dokumenttipohjainen tietokanta, lue tämä http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Tietenkin voimme myös tallentaa välimuistin tiedostona kovalevylle, mikä on halvin tapa skaalautuvuuden kannalta, ja tämä artikkeli käsittelee oman tiedostovälimuistin rakentamista.
1:OutputCacheProvider
OutputCacheProvider on abstrakti perusluokka, jonka meidän täytyy ohittaa neljä sen metodista, jotka ovat:
Lisää menetelmä määritellyn kohteen lisäämiseksi ulostulovälimuistiin.
Get metodi, joka palauttaa viitteen määritettyyn kohteeseen ulostulovälimuistissa.
Poista menetelmä poistaaksesi määritellyn kohteen ulostulovälimuistista.
Aseta metodi, joka lisää määritellyn alkion ulostulovälimuistiin ja ylikirjoittaa kohteen, jos se on välimuistissa.
2: Luo oma tiedostovälimuistin käsittelyluokka
Tyyppi on FileCacheProvider, ja koodi on seuraava:

  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. }
Kopioi koodi
On kaksi paikkaa, jotka vaativat erityistä huomiota:
Lisä-menetelmässä on ehdollinen tuomio, joka täytyy käsitellä tällä tavalla, muuten välimuistimekanismi välimuistittaa ensimmäisen tuloksen, ja välimuisti vanhenee vanhentumispäivän jälkeen eikä sitä rakenneta uudelleen.
Esimerkkiohjelmassa laitamme välimuistin yksinkertaisesti välimuistihakemistoon, ja varsinaisessa projektissa, kun välimuistissa olevat sivut ovat tuhansia, meidän täytyy tehdä hakemistojen luokittelu, muuten välimuistitiedostojen löytäminen ja lukeminen muodostaa tehokkuuden pullonkaulan, joka kuluttaa prosessoria.
3: Konfiguraatiotiedosto

Meidän täytyy konfiguroida Web.configissa, että välimuistin käsittelijä on mukautettu FileCacheProvider, eli lisätä solmu FileCacheProviderin alle:
  1. <caching>
  2.   <outputCache defaultProvider="FileCache">
  3.     <providers>
  4.       <add name="FileCache" type="MvcApplication2.Common.FileCacheProvider" cachePath="~/Cache" />
  5.     </providers>
  6.   </outputCache>
  7. </caching>
Kopioi koodi

4: Välimuistin käyttö

Oletamme, että käyttäessäsi sitä MVC:n hallinnassa (jos haluat käyttää sitä ASP.NET-sivulla, sisällytä <% page@OutputCache VaryByParam="none" Duration="10" %>), ja näet, että Index ei ole välimuistissa, kun taas Index2 on välimuistissa 10 sekuntia.
  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. }
Kopioi koodi
5: Tarkista vaikutus
Yllä oleva koodi luo Index2:n jälkeen välimuistitiedoston Cache-kansioon seuraavasti:

Arvioidaan nyt suorituskyvyn vertailu ulostulovälimuistin ja ulostulovälimuistin välillä, simuloiden 100 samanaikaista pyyntöä 100 käyttäjältä seuraavasti:








Edellinen:Sessionin elinkaari
Seuraava:C#. .NET estääkseen SQL-injektiohyökkäykset
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com