Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 16824|Atsakyti: 0

[ASP.NET] Sukurkite pasirinktinę failų talpyklą ASP.NET optimizuokite našumą

[Kopijuoti nuorodą]
Paskelbta 2015-04-19 22:06:12 | | | |
ASP.NET išvesties talpykla (t. y. statinis HTML) buvo pagrįsta atmintimi iki .NET 4.0. Tai reiškia, kad jei mūsų svetainėje yra daug talpyklos, lengva sunaudoti vietinę atmintį. Dabar, padedant . OutputCacheProvider .NET 4.0 turime keletą galimybių sukurti savo talpyklą. Pavyzdžiui, HTML išvesties talpyklą galime saugoti memcached paskirstytame klasterio serveryje arba MongoDB (dažniausiai naudojama į dokumentus orientuota duomenų bazė, skaitykite šį http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Žinoma, talpyklą taip pat galime saugoti kaip failą standžiajame diske, o tai yra pigiausias būdas tai padaryti, atsižvelgiant į mastelio keitimą, o šis straipsnis yra apie tai, kaip sukurti pasirinktinę failų talpyklą.
1:Išvestinės talpyklos teikėjas
"OutputCacheProvider" yra abstrakti bazinė klasė, kurią turime perrašyti keturis jos metodus, kurie yra:
Pridėti metodą, kaip įterpti nurodytą elementą į išvesties talpyklą.
Gauti metodas, kuris pateikia nuorodą į nurodytą elementą išvesties talpykloje.
Pašalinkite nurodyto elemento pašalinimo iš išvesties talpyklos metodą.
Nustatyti metodą, įterpia nurodytą elementą į išvesties talpyklą ir perrašo elementą, jei jis yra talpykloje.
2: Sukurkite savo failų talpyklos tvarkymo klasę
Tipas yra FileCacheProvider, o kodas yra toks:

  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. }
Kopijuoti kodą
Yra dvi vietos, kurioms reikia skirti ypatingą dėmesį:
Taikant pridėjimo metodą, yra sąlyginis sprendimas, kuris turi būti tvarkomas tokiu būdu, kitaip talpyklos mechanizmas talpykloje išsaugos pirmąjį rezultatą, o talpykla baigsis pasibaigus galiojimo laikui ir nebus atkurta.
Programos pavyzdyje mes tiesiog įdėjome talpyklą į talpyklos katalogą, o faktinėje projekto praktikoje, atsižvelgiant į tai, kad talpykloje saugomų puslapių bus tūkstančiai, turime atlikti katalogų klasifikaciją, kitaip talpyklos failų radimas ir skaitymas taps efektyvumo kliūtimi, kuri išeikvoja procesorių.
3: Konfigūracijos failas

Web.config turime sukonfigūruoti, kad talpyklos apdorojimo programa yra pasirinktinis FileCacheProvider, t. y. pridėkite mazgą pagal 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>
Kopijuoti kodą

4: Talpyklos naudojimas

Mes darome prielaidą, kad naudojant jį MVC kontrolės (jei norite jį naudoti ASP.NET puslapyje, įtraukti <% į page@OutputCache VaryByParam="none" Duration="10" %>), ir jūs galite pamatyti, kad indeksas nėra išvesties talpykloje, o Index2 yra išvesties talpykloje 10 sekundžių.
  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. }
Kopijuoti kodą
5: Patikrinkite efektą
Aukščiau pateiktas kodas, prisijungęs prie "Index2", talpyklos aplanke sugeneruos talpyklos failą taip:

Dabar įvertinkime išvesties talpyklos ir išvesties talpyklos našumo palyginimą, imituodami 100 vienu metu pateiktų užklausų iš 100 vartotojų taip:








Ankstesnis:Seanso gyvavimo ciklas
Kitą:C#. .NET, kad būtų išvengta SQL injekcijos atakų
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com