Obwohl wir uns jetzt im Breitbandzeitalter befinden und die Kätzchen uns als Entwickler von WEB-Anwendungen allmählich verlassen haben, haben wir immer noch die Verantwortung und Verpflichtung, die Leistung von WEB-Anwendungen kontinuierlich durch technische Mittel zu optimieren, damit Benutzer beim Surfen weniger warten müssen.
Glücklicherweise profitiert ASP.NET als WEB-Entwicklungstechnologie auf Basis von .Net Framework auch von den Vorteilen von .Net Framework. .Net Framework bietet uns eine gute Cache-Technologie, die es uns ermöglicht, schnellere und benutzerfreundlichere WEB-Anwendungen zu entwickeln. Der Namespace System.Web.Caching stellt die Cache-Klasse bereit, deren Wirksamkeit von den folgenden drei Situationen abhängt:
1. Zeitpunkt (gültig innerhalb des angegebenen Zeitpunkts);
2. KEY-Wert (KEY-Wert wird als Cache-Element-ID verwendet);
3. Datei oder Verzeichnis (wenn sich die angegebene Datei oder das angegebene Verzeichnis ändert, ist das ursprüngliche Cache-Element nicht verfügbar);
Als Nächstes erkläre ich Ihnen, wie Sie mit Cache die Leistung von ASP.NET-Anwendungen basierend auf tatsächlich entwickelten Anwendungen verbessern können.
In der Entwicklung stoßen wir häufig auf das Problem, dass die Datensatzliste (z. B. die kürzlich aktualisierte Nachrichtenliste Top N) und der Datensatz selbst (z. B. eine Nachricht) wiederholt gelesen werden müssen jedes Mal aus der Datenbank? Wenn Sie schlau sind, wissen Sie vielleicht, dass dies völlig unnötig ist.
Um die Verarbeitung zu erleichtern, könnten wir genauso gut eine SiteCache-Klasse entwerfen (die Lehren aus CSCache.cs in CS zieht) und mehrere statische Methoden bereitstellen, um das Hinzufügen und Löschen von Cache-Elementen zu handhaben.
Code:
SiteCache.cs
1System verwenden;
2using System.Collections;
3using System.Text.RegularExpressions;
4mit System.Web;
5mit System.Web.Caching;
6
7Namespace Ycweb.Components
8{
9 SiteCache der öffentlichen Klasse
10 {
11 privater statischer schreibgeschützter Cache _cache;
12 public static readonly int DayFactor;
13 privater statischer int-Faktor;
14 public static readonly int HourFactor;
15 public static readonly int MinuteFactor;
16
17 statischer SiteCache()
18 {
19DayFactor = 17280;
20 Stundenfaktor = 720;
21 Minutenfaktor = 12;
22 Faktor = 5;
23 _cache = HttpRuntime.Cache;
vierundzwanzig }
25
26 privater SiteCache()
27 {
28 }
29
30 öffentliche statische Leere Clear()
31 {
32 IDictionaryEnumerator enumerator = _cache.GetEnumerator();
33 while (enumerator.MoveNext())
34 {
35 _cache.Remove(enumerator.Key.ToString());
36}
37 }
38
39 öffentliches statisches Objekt Get(string key)
40 {
41 return _cache[key];
42 }
43
44 public static void Insert(string key, object obj)
45 {
46 Insert(key, obj, null, 1);
47 }
48
49 public static void Insert(string key, object obj, int seconds)
50 {
51 Insert(key, obj, null, seconds);
52 }
53
54 public static void Insert(string key, object obj, CacheDependency dep)
55 {
56 Insert(key, obj, dep, HourFactor*12);
57 }
58
59 public static void Insert(string key, object obj, int seconds, CacheItemPriority Priority)
60 {
61 Einfügen(Schlüssel, Obj, Null, Sekunden, Priorität);
62 }
63
64 public static void Insert(string key, object obj, CacheDependency dep, int seconds)
65 {
66 Insert(key, obj, dep, seconds, CacheItemPriority.Normal);
67 }
68
69 public static void Insert(string key, object obj, CacheDependency dep, int seconds, CacheItemPriority Priority)
70 {
71 if (obj != null)
72 {
73 _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds((double) (Factor*seconds)), TimeSpan.Zero, Priority, null);
74}
75 }
76
77 public static void Max(string key, object obj)
78 {
79 Max(key, obj, null);
80}
81
82 public static void Max(string key, object obj, CacheDependency dep)
83 {
84 if (obj != null)
85 {
86 _cache.Insert(key, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.AboveNormal, null);
87 }
88}
89
90 public static void MicroInsert(string key, object obj, int secondFactor)
91 {
92 if (obj != null)
93 {
94 _cache.Insert(key, obj, null, DateTime.Now.AddSeconds((double) (Factor*secondFactor)), TimeSpan.Zero);
95 }
96 }
97
98 public static void Remove(string key)
99 {
100 _cache.Remove(key);
101 }
102
103 public static void RemoveByPattern(string pattern)
104 {
105 IDictionaryEnumerator enumerator = _cache.GetEnumerator();
106 Regex regex1 = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
107 while (enumerator.MoveNext())
108 {
109 if (regex1.IsMatch(enumerator.Key.ToString()))
110 {
111 _cache.Remove(enumerator.Key.ToString());
112 }
113 }
114 }
115
116 public static void ReSetFactor(int cacheFactor)
117 {
118 Faktor = Cachefaktor;
119 }
120
121
122
123 }
124}
Tatsächlich verwendet diese Klasse hauptsächlich die oben erwähnten ersten und zweiten Funktionen der Cache-Abhängigkeiten, um unsere eigenen Cache-Elemente zu verwalten.
Nachdem wir nun die SiteCache-Klasse haben, wollen wir sehen, wie man sie verwendet. Oder lesen Sie als Beispiel die Nachrichten-TonN-Liste:
1public static RecordSet GetNewsSetTopN(string classCode,int topN,SortPostsBy orderBy, SortOrder sortOrder, string language)
2{
3 string cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}:OB:{3}:SO:{4}", language,classCode,topN.ToString( ), orderBy.ToString(),sortOrder.ToString());
4
5 //Cache-Elemente aus Kontext lesen
6 RecordSet newsSet = HttpContext.Current.Items[cacheKey] as RecordSet;
7 if (newsSet == null)
8 {
9 //Cache-Elemente aus HttpRuntime.Cache lesen
10 newsSet = SiteCache.Get(cacheKey) as RecordSet;
11 if (newsSet == null)
12 {
13 //Direkt aus der Datenbank lesen
14 CommonDataProvider dp=CommonDataProvider.Instance();
15 newsSet =dp.GetNewsSetTopN(sprache,classCode,topN,orderBy,sortOrder);
16 //Und die Ergebnisse in HttpRuntime.Cache zwischenspeichern
17 SiteCache.Insert(cacheKey, newsSet, 60, CacheItemPriority.Normal);
18}
19
20}
21return newsSet;
zweiundzwanzig}
Auf diese Weise ist es nicht erforderlich, innerhalb von 5 Minuten wiederholt auf die Datenbank zuzugreifen, um die Liste zu lesen. Natürlich werden einige Leute fragen, was passiert, wenn ein bestimmter Nachrichtenartikel innerhalb dieser 5 Minuten gelöscht oder geändert wird. Wir können das Cache-Element basierend auf dem Cache-SCHLÜSSEL löschen oder ändern. Wenn Ihnen die Aktualität der Liste nicht besonders wichtig ist, können Sie das Cache-Element natürlich nicht zwangsweise löschen Artikel verfallen automatisch zum definierten Zeitpunkt. Natürlich ist es am besten, eine Methode bereitzustellen, um Cache-Elemente basierend auf übereinstimmenden Musterelementen zwangsweise zu löschen, zum Beispiel:
1/**//// <Zusammenfassung>
2/// Löschen Sie die Cache-Elemente der passenden NewsSetTopN-Liste
3/// </summary>
4public static void ClearNewsSetTopNCache(string language,string classCode,int topN)
5{
6 string cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}", language,classCode,topN.ToString());
7 SiteCache.RemoveByPattern(cacheKey);
8}
9.
Rufen Sie nach der Veröffentlichung der Nachrichten die statische Methode ClearNewsSetTopNCache() auf, um die ursprünglichen TopN-Cache-Elemente zwangsweise zu löschen, zum Beispiel:
1/**//// <Zusammenfassung>
2/// Veröffentlichen Sie (neue) Nachrichten
3/// </summary>
4/// <param name="post">News-Beispiel</param>
5/// <returns>Rückgabestatus</returns>
6public static int Create(Newsbeitrag)
7{
8 int-Status;
9 CommonDataProvider dp=CommonDataProvider.Instance();
10 dp.CreateUpdateDeleteNews(post, DataAction.Create, out status);
11 //Löschen übereinstimmender Cache-Elemente erzwingen
12 ClearNewsSetTopNCache (post.Language, post.ClassCode,Globals.GetSiteSetting.NewsListTopN);
13 Rückgabestatus;
14}
Das ist alles. Wenn etwas nicht stimmt, hoffe ich, dass mich alle Kollegen korrigieren.