Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 16824|Risposta: 0

[ASP.NET] Costruire una cache file personalizzata ASP.NET ottimizzare le prestazioni

[Copiato link]
Pubblicato su 19/04/2015 22:06:12 | | | |
ASP.NET cache di output (cioè HTML statico) era basata sulla memoria fino a .NET 4.0. Questo significa che se il nostro sito contiene molta cache, è facile consumare memoria locale. Ora, con l'aiuto di . OutputCacheProvider in .NET 4.0, abbiamo diverse opzioni per creare la nostra cache. Ad esempio, possiamo memorizzare la cache di uscita HTML in un server cluster distribuito con memcache o in MongoDB (un database orientato ai documenti comunemente usato, leggi http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Ovviamente, possiamo anche memorizzare la cache come file sull'hard disk, che è il modo più economico considerando la scalabilità, e questo articolo parla di come costruire una cache file personalizzata.
1:OutputCacheProvider
OutputCacheProvider è una classe base astratta per cui dobbiamo sovrascrivere quattro dei suoi metodi, che sono:
Aggiungi il metodo per inserire l'elemento specificato nella cache di output.
get, che restituisce un riferimento all'elemento specificato nella cache di output.
Rimuovi il metodo per rimuovere l'elemento specificato dalla cache di output.
imposta, inserisce l'elemento specificato nella cache di output e sovrascrive l'elemento se è archiviato.
2: Crea la tua classe di gestione della cache file
Il tipo è FileCacheProvider, e il codice è il seguente:

  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. }
Copia codice
Ci sono due luoghi che richiedono particolare attenzione:
Nel metodo Aggiungi, esiste un giudizio condizionale che deve essere gestito in questo modo, altrimenti il meccanismo di cache memorizzerà il primo risultato, la cache scadrà dopo la data di scadenza e non verrà ricostruita.
Nel programma di esempio, mettiamo semplicemente la cache nella directory della cache, e nella pratica reale del progetto, considerando che le pagine cache saranno migliaia, dobbiamo fare la classificazione delle directory, altrimenti trovare e leggere file cache diventerebbe un collo di bottiglia di efficienza, che consumerà la CPU.
3: File di configurazione

Dobbiamo configurare in Web.config che il gestore della cache sia un FileCacheProvider personalizzato, cioè aggiungere un nodo sotto 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>
Copia codice

4: Uso della cache

Supponiamo che l'uso sotto il controllo di MVC (se vuoi usarlo in una pagina ASP.NET, includi il <% nella page@OutputCache VaryByParam="none" Duration="10" %>), e puoi vedere che Index non è in cache in output, mentre Index2 è in cache per 10 secondi.
  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. }
Copia codice
5: Controlla l'effetto
Il codice sopra, dopo aver consultato Index2, genererà un file cache nella cartella Cache, come segue:

Ora, valutiamo il confronto delle prestazioni tra la cache di uscita e quella di output, simulando 100 richieste concorrenti da 100 utenti come segue:








Precedente:Il ciclo di vita di Session
Prossimo:C#. .NET per prevenire attacchi di iniezione SQL
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com