ASP.NET tulostusvälimuisti (eli staattinen HTML) perustui muistiin aina .NET 4.0:aan asti. Tämä tarkoittaa, että jos sivustollamme on paljon välimuistia, paikallismuistin kuluttaminen on helppoa. Nyt, avustuksella . OutputCacheProviderissa .NET 4.0:ssa meillä on useita vaihtoehtoja oman välimuistin luomiseen. Esimerkiksi voimme tallentaa HTML-tulostusvälimuistin memcache-hajautettuun klusteripalvelimeen tai MongoDB:hen (yleisesti käytetty dokumenttipohjainen tietokanta, lue tämä http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Tietenkin voimme myös tallentaa välimuistin tiedostona kovalevylle, mikä on halvin tapa skaalautuvuuden kannalta, ja tämä artikkeli käsittelee oman tiedostovälimuistin rakentamista.
1:OutputCacheProvider OutputCacheProvider on abstrakti perusluokka, jonka meidän täytyy ohittaa neljä sen metodista, jotka ovat: Lisää menetelmä määritellyn kohteen lisäämiseksi ulostulovälimuistiin. Get metodi, joka palauttaa viitteen määritettyyn kohteeseen ulostulovälimuistissa. Poista menetelmä poistaaksesi määritellyn kohteen ulostulovälimuistista. Aseta metodi, joka lisää määritellyn alkion ulostulovälimuistiin ja ylikirjoittaa kohteen, jos se on välimuistissa.
2: Luo oma tiedostovälimuistin käsittelyluokka Tyyppi on FileCacheProvider, ja koodi on seuraava:
- public class FileCacheProvider : OutputCacheProvider
- {
- private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
-
- public override void Initialize(string name, NameValueCollection attributes)
- {
- base.Initialize(name, attributes);
- CachePath = HttpContext.Current.Server.MapPath(attributes["cachePath"]);
- }
-
- public override object Add(string key, object entry, DateTime utcExpiry)
- {
- Object obj = Get(key);
- if (obj != null) //这一步很重要
- {
- return obj;
- }
- Set(key,entry,utcExpiry);
- return entry;
- }
-
- public override object Get(string key)
- {
- string path = ConvertKeyToPath(key);
- if (!File.Exists(path))
- {
- return null;
- }
- CacheItem item = null;
- using (FileStream file = File.OpenRead(path))
- {
- var formatter = new BinaryFormatter();
- item = (CacheItem)formatter.Deserialize(file);
- }
-
- if (item.ExpiryDate <= DateTime.Now.ToUniversalTime())
- {
- log.Info(item.ExpiryDate + "*" + key);
- Remove(key);
- return null;
- }
- return item.Item;
- }
-
-
- public override void Set(string key, object entry, DateTime utcExpiry)
- {
- CacheItem item = new CacheItem(entry, utcExpiry);
- string path = ConvertKeyToPath(key);
- using (FileStream file = File.OpenWrite(path))
- {
- BinaryFormatter formatter = new BinaryFormatter();
- formatter.Serialize(file, item);
- }
- }
-
- public override void Remove(string key)
- {
- string path = ConvertKeyToPath(key);
- if (File.Exists(path))
- File.Delete(path);
- }
-
- public string CachePath
- {
- get;
- set;
- }
-
- private string ConvertKeyToPath(string key)
- {
- string file = key.Replace('/', '-');
- file += ".txt";
- return Path.Combine(CachePath, file);
- }
- }
-
- [Serializable]
- public class CacheItem
- {
- public DateTime ExpiryDate;
- public object Item;
-
- public CacheItem(object entry, DateTime utcExpiry)
- {
- Item = entry;
- ExpiryDate = utcExpiry;
- }
- }
Kopioi koodi On kaksi paikkaa, jotka vaativat erityistä huomiota: Lisä-menetelmässä on ehdollinen tuomio, joka täytyy käsitellä tällä tavalla, muuten välimuistimekanismi välimuistittaa ensimmäisen tuloksen, ja välimuisti vanhenee vanhentumispäivän jälkeen eikä sitä rakenneta uudelleen. Esimerkkiohjelmassa laitamme välimuistin yksinkertaisesti välimuistihakemistoon, ja varsinaisessa projektissa, kun välimuistissa olevat sivut ovat tuhansia, meidän täytyy tehdä hakemistojen luokittelu, muuten välimuistitiedostojen löytäminen ja lukeminen muodostaa tehokkuuden pullonkaulan, joka kuluttaa prosessoria.
3: Konfiguraatiotiedosto
Meidän täytyy konfiguroida Web.configissa, että välimuistin käsittelijä on mukautettu FileCacheProvider, eli lisätä solmu FileCacheProviderin alle:- <caching>
- <outputCache defaultProvider="FileCache">
- <providers>
- <add name="FileCache" type="MvcApplication2.Common.FileCacheProvider" cachePath="~/Cache" />
- </providers>
- </outputCache>
- </caching>
Kopioi koodi
4: Välimuistin käyttö
Oletamme, että käyttäessäsi sitä MVC:n hallinnassa (jos haluat käyttää sitä ASP.NET-sivulla, sisällytä <% page@OutputCache VaryByParam="none" Duration="10" %>), ja näet, että Index ei ole välimuistissa, kun taas Index2 on välimuistissa 10 sekuntia.
- public class HomeController : Controller
- {
- private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
- static string s_conn = "Data Source=192.168.0.77;Initial Catalog=luminjidb;User Id=sa;Password=sa;";
- public ActionResult Index()
- {
- 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()"))
- {
- ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString();
- }
- return View();
- }
-
- [OutputCache(Duration = 10, VaryByParam = "none")]
- public ActionResult Index2()
- {
- 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()"))
- {
- ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString();
- }
- return View();
- }
- }
Kopioi koodi 5: Tarkista vaikutus Yllä oleva koodi luo Index2:n jälkeen välimuistitiedoston Cache-kansioon seuraavasti:
Arvioidaan nyt suorituskyvyn vertailu ulostulovälimuistin ja ulostulovälimuistin välillä, simuloiden 100 samanaikaista pyyntöä 100 käyttäjältä seuraavasti:
|