See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 16824|Vastuse: 0

[ASP.NET] Loo kohandatud failivahemälu ASP.NET jõudluse optimeerimist

[Kopeeri link]
Postitatud 19.04.2015 22:06:12 | | | |
ASP.NET väljundvahemällu salvestamine (st staatiline HTML) oli mälupõhine kuni .NET 4.0-ni. See tähendab, et kui meie sait sisaldab palju vahemälu, on lihtne kasutada kohalikku mälu. Nüüd, abiga . OutputCacheProvider puhul .NET 4.0-s on meil mitu võimalust oma vahemälu loomiseks. Näiteks saame salvestada HTML-väljundi vahemälu memcachetud hajutatud klastriserverisse või MongoDB-sse (tavaliselt kasutatav dokumendipõhine andmebaas, loe seda http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Muidugi saame vahemälu salvestada ka failina kõvakettal, mis on skaleeritavuse seisukohalt kõige odavam viis seda teha, ning see artikkel käsitleb kohandatud failivahemälu loomist.
1:OutputCacheProvider
OutputCacheProvider on abstraktne baasklass, mida peame üle kirjutama neli selle meetodit, milleks on:
Lisa meetod, et sisestada määratud element väljundvahemälu.
Get meetod, mis tagastab viite väljundvahemälus määratud üksusele.
Eemalda meetod, et eemaldada määratud üksus väljundvahemälust.
Set meetod, sisestab määratud üksuse väljundvahemälu ja kirjutab selle üle, kui see on vahemällu salvestatud.
2: Loo oma failivahemälu haldamise klass
Tüüp on FileCacheProvider ja kood on järgmine:

  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. }
Kopeeri kood
On kaks kohta, mis vajavad erilist tähelepanu:
Add meetodis tuleb tinglik otsus sellisel viisil käsitleda, vastasel juhul vahemällu salvestamise mehhanism salvestab esimese tulemuse ning vahemälu aegub pärast aegumiskuupäeva ega ehitata uuesti.
Näidisprogrammis paneme lihtsalt vahemälu vahemälu kausta, ja tegelikus projektipraktikas, arvestades, et vahemällu salvestatud lehekülgi on tuhandeid, peame tegema kataloogide klassifitseerimise, vastasel juhul muutub vahemälufailide leidmine ja lugemine efektiivsuse kitsaskohaks, mis kurnab protsessorit.
3: Konfiguratsioonifail

Web.config'is tuleb seadistada, et vahemälu haldaja on kohandatud FileCacheProvider, st lisama sõlme FileCacheProvideri alla:
  1. <caching>
  2.   <outputCache defaultProvider="FileCache">
  3.     <providers>
  4.       <add name="FileCache" type="MvcApplication2.Common.FileCacheProvider" cachePath="~/Cache" />
  5.     </providers>
  6.   </outputCache>
  7. </caching>
Kopeeri kood

4: Vahemälu kasutamine

Eeldame, et kui seda kasutada MVC kontrolli all (kui tahad seda kasutada ASP.NET lehel, lisa <% page@OutputCache VaryByParam="none" Duration="10" %>), ja näed, et Index ei ole väljundis vahemällu salvestatud, samas kui Index2 on vahemällu salvestatud 10 sekundit.
  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. }
Kopeeri kood
5: Kontrolli mõju
Ülaltoodud kood genereerib pärast Index2 ligipääsu vahemälufaili Cache kaustas järgmiselt:

Nüüd hindame väljundvahemälu ja väljundvahemälu jõudluse võrdlust, simuleerides 100 samaaegset päringut 100 kasutajalt järgmiselt:








Eelmine:Sessiooni elutsükkel
Järgmine:C#. .NET, et vältida SQL süstimise rünnakuid
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com