Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 16824|Απάντηση: 0

[ASP.NET] Δημιουργήστε μια προσαρμοσμένη προσωρινή μνήμη αρχείων ASP.NET βελτιστοποίηση απόδοσης

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 19/4/2015 10:06:12 μ.μ. | | | |
ASP.NET προσωρινή αποθήκευση εξόδου (δηλαδή στατική HTML) βασιζόταν στη μνήμη μέχρι το .NET 4.0. Αυτό σημαίνει ότι εάν ο ιστότοπός μας περιέχει πολλή προσωρινή μνήμη, είναι εύκολο να καταναλώσετε τοπική μνήμη. Τώρα, με τη βοήθεια του . OutputCacheProvider στο .NET 4.0, έχουμε πολλές επιλογές για να δημιουργήσουμε τη δική μας προσωρινή μνήμη. Για παράδειγμα, μπορούμε να αποθηκεύσουμε την προσωρινή μνήμη εξόδου HTML σε έναν διακομιστή κατανεμημένου συμπλέγματος memcached ή MongoDB (μια ευρέως χρησιμοποιούμενη βάση δεδομένων προσανατολισμένη σε έγγραφα, διαβάστε αυτήν την http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx). Φυσικά, μπορούμε επίσης να αποθηκεύσουμε την προσωρινή μνήμη ως αρχείο στον σκληρό δίσκο, που είναι ο φθηνότερος τρόπος για να το κάνουμε λαμβάνοντας υπόψη την επεκτασιμότητα, και αυτό το άρθρο αφορά τον τρόπο δημιουργίας μιας προσαρμοσμένης προσωρινής μνήμης αρχείων.
1:OutputCacheProvider
Το OutputCacheProvider είναι μια αφηρημένη βασική κλάση που πρέπει να παρακάμψουμε τέσσερις από τις μεθόδους της, οι οποίες είναι:
Προσθέστε μέθοδο για να εισαγάγετε το καθορισμένο στοιχείο στην κρυφή μνήμη εξόδου.
Get, η οποία επιστρέφει μια αναφορά στο καθορισμένο στοιχείο στην κρυφή μνήμη εξόδου.
Καταργήστε τη μέθοδο για να αφαιρέσετε το καθορισμένο στοιχείο από την προσωρινή μνήμη εξόδου.
Set μέθοδος, εισάγει το καθορισμένο στοιχείο στην κρυφή μνήμη εξόδου και αντικαθιστά το στοιχείο εάν είναι αποθηκευμένο στην κρυφή μνήμη.
2: Δημιουργήστε τη δική σας κλάση χειρισμού προσωρινής αποθήκευσης αρχείων
Ο τύπος είναι FileCacheProvider και ο κωδικός είναι ο εξής:

  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. }
Αντιγραφή κώδικα
Υπάρχουν δύο μέρη που χρειάζονται ιδιαίτερη προσοχή:
Στη μέθοδο Προσθήκη, υπάρχει μια υπό όρους κρίση που πρέπει να αντιμετωπιστεί με αυτόν τον τρόπο, διαφορετικά ο μηχανισμός προσωρινής αποθήκευσης θα αποθηκεύσει προσωρινά το πρώτο αποτέλεσμα και η προσωρινή μνήμη θα λήξει μετά την ημερομηνία λήξης και δεν θα ξαναχτιστεί.
Στο παράδειγμα προγράμματος, απλώς βάζουμε την κρυφή μνήμη στον κατάλογο της κρυφής μνήμης και στην πραγματική πρακτική του έργου, λαμβάνοντας υπόψη ότι οι αποθηκευμένες σελίδες θα είναι χιλιάδες, πρέπει να κάνουμε ταξινόμηση καταλόγου, διαφορετικά η εύρεση και η ανάγνωση αρχείων προσωρινής μνήμης θα γίνει συμφόρηση αποτελεσματικότητας, η οποία θα εξαντλήσει την CPU.
3: Αρχείο διαμόρφωσης

Πρέπει να ρυθμίσουμε στο Web.config ότι ο χειριστής προσωρινής μνήμης είναι ένας προσαρμοσμένος FileCacheProvider, δηλαδή να προσθέσουμε έναν κόμβο κάτω από το 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>
Αντιγραφή κώδικα

4: Χρήση προσωρινής μνήμης

Υποθέτουμε ότι η χρήση του στον έλεγχο του MVC (αν θέλετε να το χρησιμοποιήσετε σε μια σελίδα ASP.NET, συμπεριλάβετε το <% στο page@OutputCache VaryByParam="none" Duration="10" %>) και μπορείτε να δείτε ότι το Index δεν είναι αποθηκευμένο στην κρυφή μνήμη, ενώ το Index2 είναι αποθηκευμένο στην κρυφή μνήμη εξόδου για 10 δευτερόλεπτα.
  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. }
Αντιγραφή κώδικα
5: Ελέγξτε το εφέ
Ο παραπάνω κώδικας, μετά την πρόσβαση στο Index2, θα δημιουργήσει ένα αρχείο προσωρινής μνήμης στο φάκελο Cache, ως εξής:

Τώρα, ας αξιολογήσουμε τη σύγκριση απόδοσης μεταξύ της κρυφής μνήμης εξόδου και της κρυφής μνήμης εξόδου, προσομοιώνοντας 100 ταυτόχρονα αιτήματα από 100 χρήστες ως εξής:








Προηγούμενος:Κύκλος ζωής συνεδρίας
Επόμενος:C#. .NET για την αποτροπή επιθέσεων SQL injection
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com