Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 16824|Svar: 0

[ASP.NET] Byg en brugerdefineret filcache ASP.NET optimering af ydeevnen

[Kopier link]
Opslået på 19/04/2015 22.06.12 | | | |
ASP.NET output-caching (dvs. statisk HTML) var hukommelsesbaseret indtil .NET 4.0. Det betyder, at hvis vores site indeholder meget cache, er det nemt at bruge lokal hukommelse. Nu, med hjælp fra . OutputCacheProvider i .NET 4.0 har vi flere muligheder for at oprette vores egen cache. For eksempel kan vi gemme HTML-outputcachen i en memcachet distribueret klyngeserver eller MongoDB (en almindeligt brugt dokumentorienteret database, læs dette http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Selvfølgelig kan vi også gemme cachen som en fil på harddisken, hvilket er den billigste måde at gøre det på med hensyn til skalerbarhed, og denne artikel handler om, hvordan man bygger en brugerdefineret filcache.
1:OutputCacheProvider
OutputCacheProvider er en abstrakt baseklasse, som vi skal tilsidesætte fire af dens metoder, som er:
Tilføj metode til at indsætte det specificerede element i output-cachen.
Get-metoden, som returnerer en reference til det angivne element i outputcachen.
Fjern metode for at fjerne det specificerede element fra outputcachen.
Set metode, indsætter det specificerede element i outputcachen og overskriver elementet, hvis det er cachet.
2: Opret din egen fil-caching 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 kode
Der er to steder, der kræver særlig opmærksomhed:
I Add-metoden er der en betinget vurdering, der skal håndteres på denne måde, ellers vil caching-mekanismen cache det første resultat, og cachen udløber efter udløbsdatoen og vil ikke blive genopbygget.
I eksempelprogrammet lægger vi blot cachen i cache-mappen, og i faktisk projektpraksis, når vi tager i betragtning at de cachede sider vil være tusindvis, skal vi lave mappeklassifikation, ellers vil det at finde og læse cachefiler blive en effektivitetsflaskehals, som dræner CPU'en.
3: Konfigurationsfil

Vi skal konfigurere i Web.config, så cache-handleren er en brugerdefineret FileCacheProvider, dvs. tilføje 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 kode

4: Brug af cache

Vi antager, at brug af det i MVC's kontrol (hvis du vil bruge det på en ASP.NET-side, inkluder <% i page@OutputCache VaryByParam="ingen" Varighed="10" %>), og du kan se, at Index ikke outputtes cachet, mens Index2 er outputtet 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 kode
5: Tjek effekten
Ovenstående kode vil efter tilgang til Index2 generere en cachefil i cache-mappen som følger:

Lad os nu evaluere performance-sammenligningen mellem outputcachen og outputcachen og simulere 100 samtidige forespørgsler fra 100 brugere som følger:








Tidligere:Sessionens livscyklus
Næste:C#. .NET for at forhindre SQL-injektionsangreb
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com