Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 16824|Svare: 0

[ASP.NET] Bygg en egendefinert filcache ASP.NET ytelsesoptimalisering

[Kopier lenke]
Publisert på 19.04.2015 22:06:12 | | | |
ASP.NET utdatacaching (dvs. statisk HTML) var minnebasert frem til .NET 4.0. Dette betyr at hvis nettstedet vårt inneholder mye cache, er det lett å bruke lokalt minne. Nå, med hjelp av . OutputCacheProvider i .NET 4.0, vi har flere alternativer for å lage vår egen cache. For eksempel kan vi lagre HTML-utdatacachen i en memcached distribuert klyngeserver eller MongoDB (en ofte brukt dokumentorientert database, les dette http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Selvfølgelig kan vi også lagre cachen som en fil på harddisken, noe som er den billigste måten å gjøre det på med tanke på skalerbarhet, og denne artikkelen handler om hvordan man bygger en egendefinert filcache.
1:OutputCacheProvider
OutputCacheProvider er en abstrakt baseklasse hvor vi må overstyre fire av metodene, som er:
Legg til metode for å sette inn det spesifiserte elementet i utdatacachen.
Get-metoden, som returnerer en referanse til det spesifiserte elementet i utdatacachen.
Fjern metode for å fjerne det spesifiserte elementet fra utdatacachen.
Sett-metoden, setter inn det spesifiserte elementet i utdatacachen, og overskriver elementet hvis det er cachet.
2: Lag din egen fil-cache-håndteringsklasse
Typen er FileCacheProvider, og koden er som følger:

  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. }
Kopier koden
Det er to steder som trenger spesiell oppmerksomhet:
I Add-metoden må det håndteres en betinget vurdering på denne måten, ellers vil caching-mekanismen cache det første resultatet, og cachen vil utløpe etter utløpsdatoen og vil ikke bli bygget opp på nytt.
I eksempelprogrammet legger vi ganske enkelt cachen i cache-katalogen, og i faktisk prosjektpraksis, med tanke på at de bufrede sidene vil være tusenvis, må vi gjøre katalogklassifisering, ellers vil det å finne og lese cache-filer bli en effektivitetsflaskehals som tapper CPU-en.
3: Konfigurasjonsfil

Vi må konfigurere i Web.config at cache-håndtereren er en egendefinert FileCacheProvider, altså legge til en node under 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>
Kopier koden

4: Bruk av cache

Vi antar at bruk av det i MVCs kontroll (hvis du vil bruke det på en ASP.NET side, inkluder < % i page@OutputCache VaryByParam="none" Varighet="10" %>), og du kan se at Index ikke blir skrevet ut i cache, mens Index2 er cachet i 10 sekunder.
  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. }
Kopier koden
5: Sjekk effekten
Koden ovenfor, etter tilgang til Index2, vil generere en cache-fil i cache-mappen, som følger:

La oss nå evaluere ytelsessammenligningen mellom output-cachen og output-cachen, og simulere 100 samtidige forespørsler fra 100 brukere som følger:








Foregående:Øktens livssyklus
Neste:C#. .NET for å forhindre SQL-injeksjonsangrep
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com