Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 16824|Atbildi: 0

[ASP.NET] Pielāgotas failu kešatmiņas izveide ASP.NET veiktspējas optimizācija

[Kopēt saiti]
Publicēts 19.04.2015 22:06:12 | | | |
ASP.NET izvades kešatmiņa (t.i., statiskais HTML) bija balstīta uz atmiņu līdz .NET 4.0. Tas nozīmē, ka, ja mūsu vietnē ir daudz kešatmiņas, ir viegli patērēt vietējo atmiņu. Tagad, izmantojot . OutputCacheProvider .NET 4.0 mums ir vairākas iespējas, kā izveidot savu kešatmiņu. Piemēram, mēs varam saglabāt HTML izvades kešatmiņu memcached sadalītā klastera serverī vai MongoDB (bieži izmantota uz dokumentiem orientēta datu bāze, lasiet šo http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Protams, mēs varam arī saglabāt kešatmiņu kā failu cietajā diskā, kas ir lētākais veids, kā to izdarīt, ņemot vērā mērogojamību, un šis raksts ir par to, kā izveidot pielāgotu failu kešatmiņu.
1:OutputCacheProvider
OutputCacheProvider ir abstrakta bāzes klase, kas mums ir jāignorē četras no tās metodēm, kas ir:
Pievienojiet metodi, lai ievietotu norādīto vienumu izvades kešatmiņā.
Get metode, kas atgriež atsauci uz norādīto vienumu izvades kešatmiņā.
Noņemiet metodi, lai noņemtu norādīto vienumu no izvades kešatmiņas.
Set metode, ievieto norādīto vienumu izvades kešatmiņā un pārraksta vienumu, ja tas ir kešatmiņā.
2: Izveidojiet savu failu kešatmiņas apstrādes klasi
Tips ir FileCacheProvider, un kods ir šāds:

  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. }
Kopēt kodu
Ir divas vietas, kurām jāpievērš īpaša uzmanība:
Pievienot metodi ir nosacīts spriedums, kas jārīkojas šādā veidā, pretējā gadījumā kešatmiņas mehānisms kešatmiņā saglabās pirmo rezultātu, un kešatmiņa beigsies pēc derīguma termiņa beigām un netiks atjaunota.
Piemēra programmā mēs vienkārši ievietojam kešatmiņu kešatmiņas direktorijā, un faktiskajā projekta praksē, ņemot vērā, ka kešatmiņā saglabātās lapas būs tūkstošiem, mums ir jāveic direktoriju klasifikācija, pretējā gadījumā kešatmiņas failu atrašana un lasīšana kļūs par efektivitātes vājo kaklu, kas iztukšos CPU.
3: Konfigurācijas fails

Mums ir jākonfigurē Web.config, ka kešatmiņas apstrādātājs ir pielāgots FileCacheProvider, t.i., pievienojiet mezglu zem 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>
Kopēt kodu

4: Kešatmiņas izmantošana

Mēs pieņemam, ka, izmantojot to MVC kontrolē (ja vēlaties to izmantot ASP.NET lapā, iekļaujiet <% page@OutputCache VaryByParam="none" Duration="10" %>), un jūs varat redzēt, ka indekss netiek izvadīts kešatmiņā, bet Index2 tiek izvadīts kešatmiņā 10 sekundes.
  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. }
Kopēt kodu
5: Pārbaudiet efektu
Iepriekš minētais kods pēc piekļuves Index2 kešatmiņas mapē ģenerēs kešatmiņas failu šādi:

Tagad novērtēsim veiktspējas salīdzinājumu starp izvades kešatmiņu un izvades kešatmiņu, simulējot 100 vienlaicīgus pieprasījumus no 100 lietotājiem šādi:








Iepriekšējo:Sesijas dzīves cikls
Nākamo:C#. .NET, lai novērstu SQL injekcijas uzbrukumus
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com