Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 16824|Válasz: 0

[ASP.NET] Egyedi fájlgyorsítótár építése ASP.NET teljesítményoptimalizálás

[Linket másol]
Közzétéve 2015. 04. 19. 22:06:12 | | | |
ASP.NET kimeneti gyorsítótározás (azaz statikus HTML) memóriaalapú volt egészen a .NET 4.0-ig. Ez azt jelenti, hogy ha az oldalunk sok gyorsítótárt tartalmaz, könnyen fogyasztható helyi memóriát. Most, a . OutputCacheProvider esetén a .NET 4.0-ban több lehetőségünk van saját gyorsítótár létrehozására. Például tárolhatjuk a HTML kimeneti gyorsítótárt egy memcache-alapú elosztott klaszterszerveren vagy a MongoDB-ben (egy gyakran használt dokumentumorientált adatbázis, olvassa el ezt http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Természetesen a gyorstárt fájlként is tárolhatjuk a merevlemezen, ami a legolcsóbb módja a skálázhatóság szempontjából, és ez a cikk arról szól, hogyan lehet egyedi fájlgyorsítótárt építeni.
1:OutputCacheProvider
Az OutputCacheProvider egy absztrakt alaposztály, amelynek négy metódusát felülírni kell, amelyek a következők:
Add hozzá a megadott elem kimeneti gyorsítótárba behelyezéséhez a módszert.
Get metódus, amely a megadott elemre ad vissza egy hivatkozást a kimeneti gyorsítótárban.
Eltávolítsa a metódót, hogy eltávolítsd a megadott elemet a kimeneti gyorsítótárból.
A beállítás metódó segítségével a megadott elemet a kimeneti gyorsítótárba helyezi be, és felülírja az elemet, ha az gyorsatárban van.
2: Hozz létre saját fájlgyorsítótárkezelő osztályt
A típus FileCacheProvider, a kód pedig a következő:

  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. }
Kód másolása
Két hely van, amelyekre különös figyelmet kell fordítani:
Az Add metódusban van egy feltételes ítélet, amelyet így kell kezelni, különben a gyorsítótár mechanizmus gyorsítja az első eredményt, és a cache lejárati dátum után lejár, és nem épül újra.
A példaprogramban egyszerűen a cache könyvtárba teszünk a gyorsatárt, és a tényleges projektgyakorlatban, figyelembe véve, hogy a gyorsatárban lévő oldalak ezrei lesznek, a könyvtárosztályozást kell végeznünk, különben a gyorsítótár fájlok megtalálása és olvasása hatékonysági szűk keresztmetszetet jelent, ami kimeríti a CPU-t.
3: Konfigurációs fájl

A Web.config-ban be kell állítanunk, hogy a cache kezelő egyedi FileCacheProvider legyen, azaz hozzáadni egy csomópontot a FileCacheProvider alá:
  1. <caching>
  2.   <outputCache defaultProvider="FileCache">
  3.     <providers>
  4.       <add name="FileCache" type="MvcApplication2.Common.FileCacheProvider" cachePath="~/Cache" />
  5.     </providers>
  6.   </outputCache>
  7. </caching>
Kód másolása

4: Gyorsítótár használata

Feltételezzük, hogy az MVC irányításában (ha ASP.NET oldalon szeretnéd használni, <%-ot kell beépíteni a page@OutputCache VaryByParam="none" Duration="10" %>), és láthatjuk, hogy az Index nem kerül gyorsgyorsatárba, míg az Index2 10 másodpercig gyorsankulcsban van.
  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. }
Kód másolása
5: Nézd meg a hatást
A fenti kód, miután eléri az Index2-t, gyorsítótár fájlt generál a Cache mappában, a következőként:

Most értékeljük a teljesítményösszehasonlítást a kimeneti gyorsítótár és a kimeneti gyorsítótár között, 100 egyidejű kérést szimulálva 100 felhasználótól:








Előző:A Session életciklusa
Következő:C#. .NET az SQL injekciós támadások megelőzésére
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com