|
|
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:
- 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;
- }
- }
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:- <caching>
- <outputCache defaultProvider="FileCache">
- <providers>
- <add name="FileCache" type="MvcApplication2.Common.FileCacheProvider" cachePath="~/Cache" />
- </providers>
- </outputCache>
- </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.
- 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();
- }
- }
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 ciklsNākamo:C#. .NET, lai novērstu SQL injekcijas uzbrukumus
|