Même si nous sommes désormais à l'ère du haut débit et que les chatons nous ont progressivement quittés, en tant que développeurs d'applications WEB, nous avons toujours la responsabilité et l'obligation d'optimiser en permanence les performances des applications WEB par des moyens techniques afin que les utilisateurs puissent attendre moins lors d'une navigation plus rafraîchissante.
Heureusement, ASP.NET, en tant que technologie de développement WEB basée sur .Net Framework, bénéficie également des avantages de .Net Framework. .Net Framework nous offre une bonne technologie de cache, nous permettant de développer des applications WEB plus rapides et plus conviviales. L'espace de noms System.Web.Caching fournit la classe Cache, dont l'efficacité dépend des trois situations suivantes :
1. Point temporel (valable dans le délai spécifié) ;
2. Valeur KEY (la valeur KEY est utilisée comme identifiant d'élément de cache) ;
3. Fichier ou répertoire (si le fichier ou le répertoire spécifié change, l'élément de cache d'origine ne sera pas disponible) ;
Ensuite, je partagerai avec vous comment utiliser le cache pour améliorer les performances des applications ASP.NET basées sur les applications réellement développées.
Lors du développement, nous rencontrons souvent le problème de la lecture de la liste des enregistrements (comme la liste d'actualités Top N récemment mise à jour) et de l'enregistrement lui-même (comme une actualité lorsque l'utilisateur y accède, ces informations doivent-elles être lues à plusieurs reprises). de la base de données à chaque fois ? Si vous êtes intelligent, vous savez peut-être que cela est totalement inutile.
Afin de faciliter le traitement, autant concevoir une classe SiteCache (en tirant les leçons de CSCache.cs dans CS) et fournir plusieurs méthodes statiques pour gérer l'ajout et la suppression d'éléments de cache.
Code:
SiteCache.cs
1en utilisant le système ;
2en utilisant System.Collections ;
3en utilisant System.Text.RegularExpressions ;
4en utilisant System.Web ;
5en utilisant System.Web.Caching ;
6
7espace de noms Ycweb.Components
8{
9 SiteCache de classe publique
10 {
11 Cache privé statique en lecture seule _cache ;
12 public statique en lecture seule int DayFactor ;
13 Facteur int statique privé ;
14 public statique en lecture seule int HourFactor ;
15 public statique en lecture seule int MinuteFactor ;
16
17 SiteCache statique()
18 {
19DayFactor = 17280 ;
20 HourFactor = 720 ;
21 MinuteFactor = 12 ;
22 Facteur = 5 ;
23 _cache = HttpRuntime.Cache ;
vingt-quatre }
25
26 SiteCache privés()
27 {
28 }
29
30 vide statique public Clear()
31 {
32 IDictionaryEnumerator énumérateur = _cache.GetEnumerator();
33 while (énumérateur.MoveNext())
34 {
35 _cache.Remove(enumerator.Key.ToString());
36}
37 }
38
39 objet statique public Get (clé de chaîne)
40 {
41 return _cache[clé];
42 }
43
44 public static void Insert (clé de chaîne, objet obj)
45 {
46 Insérer(clé, obj, null, 1);
47 }
48
49 public static void Insert (clé de chaîne, objet obj, int secondes)
50 {
51 Insert(clé, obj, null, secondes);
52 }
53
54 public static void Insert (clé de chaîne, objet obj, CacheDependency dep)
55 {
56 Insérer (clé, obj, dépôt, HourFactor*12);
57 }
58
59 public static void Insert (clé de chaîne, objet obj, int secondes, priorité CacheItemPriority)
60 {
61 Insert(clé, obj, null, secondes, priorité) ;
62 }
63
64 public static void Insert (clé de chaîne, objet obj, CacheDependency dep, int secondes)
65 {
66 Insert (clé, obj, dépôt, secondes, CacheItemPriority.Normal);
67 }
68
69 public static void Insert (clé de chaîne, objet obj, CacheDependency dep, int secondes, priorité CacheItemPriority)
70 {
71 si (obj != nul)
72 {
73 _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds((double) (Factor*seconds)), TimeSpan.Zero, priorité, null);
74}
75 }
76
77 public static void Max (clé de chaîne, objet obj)
78 {
79 Max(clé, obj, nul);
80}
81
82 public static void Max (clé de chaîne, objet obj, CacheDependency dep)
83 {
84 si (obj != nul)
85 {
86 _cache.Insert(key, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.AboveNormal, null);
87 }
88}
89
90 public static void MicroInsert (clé de chaîne, objet obj, int secondFactor)
91 {
92 si (obj != nul)
93 {
94 _cache.Insert(key, obj, null, DateTime.Now.AddSeconds((double) (Factor*secondFactor)), TimeSpan.Zero);
95 }
96 }
97
98 public static void Supprimer (clé de chaîne)
99 {
100 _cache.Remove(clé);
101 }
102
103 public static void RemoveByPattern (modèle de chaîne)
104 {
105 IDictionaryEnumerator énumérateur = _cache.GetEnumerator();
106 Regex regex1 = new Regex(motif, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
107 while (énumérateur.MoveNext())
108 {
109 si (regex1.IsMatch(enumerator.Key.ToString()))
110 {
111 _cache.Remove(enumerator.Key.ToString());
112 }
113 }
114 }
115
116 vide statique public ReSetFactor (int cacheFactor)
117 {
118 Facteur = cacheFactor ;
119 }
120
121
122
123 }
124}
En fait, cette classe utilise principalement les première et deuxième fonctionnalités des dépendances de Cache mentionnées ci-dessus pour maintenir nos propres éléments de Cache.
Maintenant que nous avons la classe SiteCache, voyons comment l'utiliser. Ou prenez comme exemple la lecture de la liste d'actualités TonN :
1public static RecordSet GetNewsSetTopN (string classCode, int topN, SortPostsBy orderBy, SortOrder sortOrder, langage de chaîne)
2{
3 chaînes cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}:OB:{3}:SO:{4}", langue,classCode,topN.ToString( ), orderBy.ToString(),sortOrder.ToString());
4
5 //Lire les éléments du cache à partir du contexte
6 RecordSet newsSet = HttpContext.Current.Items[cacheKey] comme RecordSet ;
7 si (newsSet == null)
8 {
9 //Lire les éléments du cache depuis HttpRuntime.Cache
10 newsSet = SiteCache.Get(cacheKey) comme RecordSet ;
11 si (newsSet == null)
12 {
13 //Lire directement depuis la base de données
14 CommonDataProvider dp=CommonDataProvider.Instance();
15 newsSet =dp.GetNewsSetTopN(langue,classCode,topN,orderBy,sortOrder);
16 //Et cachez les résultats dans HttpRuntime.Cache
17 SiteCache.Insert(cacheKey, newsSet, 60, CacheItemPriority.Normal);
18}
19
20}
21retour newsSet ;
vingt-deux}
De cette façon, il n'est pas nécessaire d'accéder à plusieurs reprises à la base de données pour lire la liste dans les 5 minutes. Bien sûr, certaines personnes se demanderont : que se passe-t-il si une certaine actualité est supprimée ou modifiée dans ces 5 minutes ? Nous pouvons le supprimer ou le modifier. Supprimer de force l'élément de cache en fonction de la clé de cache. Bien sûr, si vous sentez que vous ne vous souciez pas particulièrement de l'actualité de la liste, vous ne pouvez pas supprimer de force l'élément de cache et laisser le cache. l’article expire automatiquement à l’heure définie. Bien sûr, il est préférable de fournir une méthode pour supprimer de force les éléments du cache en fonction des éléments de modèle correspondant, par exemple :
1/**//// <résumé>
2/// Supprimer les éléments du Cache de la liste NewsSetTopN correspondante
3/// </summary>
4public static void ClearNewsSetTopNCache (langage de chaînes, code de classe de chaîne, int topN)
5{
6 chaînes cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}",langue,classCode,topN.ToString());
7 SiteCache.RemoveByPattern(cacheKey);
8}
9.
Après avoir publié l'actualité, appelez la méthode statique ClearNewsSetTopNCache() pour effacer de force les éléments du cache TopN d'origine, par exemple :
1/**//// <résumé>
2/// Publier de (nouvelles) actualités
3/// </summary>
4/// <param name="post">Exemple d'actualité</param>
5/// <returns>Statut du retour</returns>
6public static int Créer (article d'actualité)
7{
8 statut international ;
9 CommonDataProvider dp=CommonDataProvider.Instance();
10 dp.CreateUpdateDeleteNews (post, DataAction.Create, statut de sortie) ;
11 //Forcer l'effacement des éléments de cache correspondants
12 ClearNewsSetTopNCache (post.Language, post.ClassCode,Globals.GetSiteSetting.NewsListTopN) ;
13 statut de retour ;
14}
C'est tout. S'il y a quelque chose qui ne va pas, j'espère que tous mes collègues me corrigeront.
http://www.cnblogs.com/aspsir/archive/2006/07/27/461229.html