Aunque ahora estamos en la era de la banda ancha y los gatitos nos han abandonado gradualmente, como desarrolladores de aplicaciones WEB, todavía tenemos la responsabilidad y la obligación de optimizar continuamente el rendimiento de las aplicaciones WEB a través de medios técnicos para que los usuarios puedan esperar menos mientras navegan.
Afortunadamente, ASP.NET, como tecnología de desarrollo WEB basada en .Net Framework, también disfruta de las ventajas de .Net Framework. .Net Framework nos proporciona una buena tecnología de caché, lo que nos permite desarrollar mejores aplicaciones WEB más rápidas y fáciles de usar. El espacio de nombres System.Web.Caching proporciona la clase Cache, cuya eficacia depende de las tres situaciones siguientes:
1. Punto de tiempo (válido dentro del punto de tiempo especificado);
2. Valor CLAVE (el valor CLAVE se utiliza como identificador de elemento de caché);
3. Archivo o directorio (si el archivo o directorio especificado cambia, el elemento de caché original no estará disponible);
A continuación, compartiré con usted cómo usar Cache para mejorar el rendimiento de aplicaciones ASP.NET basadas en aplicaciones desarrolladas reales.
En el desarrollo, a menudo nos encontramos con el problema de leer la lista de registros (como la lista de noticias Top N recientemente actualizada) y el registro en sí (como una noticia). Cuando el usuario accede, dicha información debe leerse repetidamente. de la base de datos cada vez? Si eres inteligente, sabrás que esto es completamente innecesario.
Para facilitar el procesamiento, también podríamos diseñar una clase SiteCache (aprendiendo lecciones de CSCache.cs en CS) y proporcionar varios métodos estáticos para manejar la adición y eliminación de elementos de caché.
Código:
SiteCache.cs
1usando el sistema;
2usando System.Colecciones;
3usando System.Text.RegularExpressions;
4usando System.Web;
5usando System.Web.Caching;
6
7espacio de nombres Ycweb.Componentes
8{
9 SiteCache de clase pública
10 {
11 Caché privado estático de solo lectura _cache;
12 público estático de solo lectura int DayFactor;
13 Factor int estático privado;
14 público estático de solo lectura int HourFactor;
15 público estático de solo lectura int MinuteFactor;
16
17 SiteCache estático()
18 {
19FactorDía = 17280;
Factor de 20 horas = 720;
21 Factor Minuto = 12;
22 factores = 5;
23 _cache = HttpRuntime.Cache;
veinticuatro}
25
26 SiteCache privado()
27 {
28 }
29
30 vacío estático público Clear()
31 {
32 Enumerador IDictionaryEnumerator = _cache.GetEnumerator();
33 mientras (enumerador.MoveNext())
34 {
35 _cache.Remove(enumerador.Key.ToString());
36}
37 }
38
39 objeto estático público Obtener (clave de cadena)
40 {
41 return _cache[clave];
42 }
43
44 Insertar vacío estático público (clave de cadena, objeto obj)
45 {
46 Insertar (clave, obj, nulo, 1);
47 }
48
49 Insertar vacío estático público (clave de cadena, objeto obj, int segundos)
50 {
51 Insertar (clave, obj, nulo, segundos);
52 }
53
54 Insertar vacío estático público (clave de cadena, objeto obj, depósito de CacheDependency)
55 {
56 Insertar(clave, obj, dep, FactorHora*12);
57 }
58
59 Insertar vacío estático público (clave de cadena, objeto obj, int segundos, prioridad CacheItemPriority)
60 {
61 Insertar (clave, obj, nulo, segundos, prioridad);
62 }
63
64 Insertar vacío estático público (clave de cadena, objeto obj, depósito de CacheDependency, int segundos)
65 {
66 Insertar (clave, obj, dep, segundos, CacheItemPriority.Normal);
67 }
68
69 Insertar vacío estático público (clave de cadena, objeto obj, depósito de CacheDependency, int segundos, prioridad CacheItemPriority)
70 {
71 si (obj! = nulo)
72 {
73 _cache.Insert(clave, obj, dep, DateTime.Now.AddSeconds((doble) (Factor*segundos)), TimeSpan.Zero, prioridad, nulo);
74}
75 }
76
77 vacío estático público Max (clave de cadena, objeto obj)
78 {
79 Max (clave, obj, nulo);
80}
81
82 vacío estático público Max (clave de cadena, objeto obj, depósito de CacheDependency)
83 {
84 si (obj! = nulo)
85 {
86 _cache.Insert (clave, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.AboveNormal, nulo);
87 }
88}
89
90 MicroInsert vacío estático público (clave de cadena, objeto obj, int secondFactor)
91 {
92 si (obj! = nulo)
93 {
94 _cache.Insert(clave, obj, nulo, DateTime.Now.AddSeconds((doble) (Factor*segundoFactor)), TimeSpan.Zero);
95 }
96 }
97
98 vacío estático público Eliminar (clave de cadena)
99 {
100 _cache.Remove(clave);
101 }
102
103 vacío estático público RemoveByPattern (patrón de cadena)
104 {
105 Enumerador IDictionaryEnumerator = _cache.GetEnumerator();
106 Regex regex1 = nueva expresión regular (patrón, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
107 mientras (enumerador.MoveNext())
108 {
109 si (regex1.IsMatch (enumerador.Key.ToString()))
110 {
111 _cache.Remove(enumerador.Key.ToString());
112 }
113 }
114 }
115
116 ReSetFactor vacío estático público (int cacheFactor)
117 {
118 Factor = factor de caché;
119 }
120
121
122
123 }
124}
De hecho, esta clase utiliza principalmente la primera y segunda característica de las dependencias de caché mencionadas anteriormente para mantener nuestros propios elementos de caché.
Ahora que tenemos la clase SiteCache, veamos cómo usarla. O tome la lectura de la lista TonN de noticias como ejemplo:
1RecordSet público estático GetNewsSetTopN(cadena classCode,int topN,SortPostsBy orderBy, SortOrder sortOrder, lenguaje de cadena)
2{
3 cadenas cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}:OB:{3}:SO:{4}", idioma,classCode,topN.ToString( ), orderBy.ToString(),sortOrder.ToString());
4
5 //Leer elementos de caché desde el contexto
6 RecordSet newsSet = HttpContext.Current.Items[cacheKey] como RecordSet;
7 si (conjunto de noticias == nulo)
8 {
9 //Leer elementos de caché de HttpRuntime.Cache
10 newsSet = SiteCache.Get(cacheKey) como RecordSet;
11 si (conjunto de noticias == nulo)
12 {
13 //Leer directamente desde la base de datos
14 CommonDataProvider dp=CommonDataProvider.Instancia();
15 newsSet =dp.GetNewsSetTopN(idioma,classCode,topN,orderBy,sortOrder);
16 //Y almacenar en caché los resultados en HttpRuntime.Cache
17 SiteCache.Insert(cacheKey, newsSet, 60, CacheItemPriority.Normal);
18}
19
20}
21noticias de regresoConjunto;
Veintidós}
De esta manera, no es necesario acceder repetidamente a la base de datos para leer la lista en 5 minutos. Por supuesto, algunas personas preguntarán, ¿qué pasa si una determinada noticia se elimina o modifica en estos 5 minutos? Podemos eliminarlo o modificarlo. Eliminar por la fuerza el elemento de caché según la CLAVE de caché. Por supuesto, si cree que no le importa especialmente la puntualidad de la lista, no puede eliminar por la fuerza el elemento de caché y dejarlo. El artículo caducará automáticamente en el momento definido. Por supuesto, es mejor proporcionar un método para eliminar por la fuerza elementos de la caché en función de elementos de patrón coincidentes, por ejemplo:
1/**//// <resumen>
2/// Eliminar los elementos de caché de la lista NewsSetTopN coincidente
3/// </summary>
4public static void ClearNewsSetTopNCache (lenguaje de cadena, código de clase de cadena, int topN)
5{
6 cadenas cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}",idioma,classCode,topN.ToString());
7 SiteCache.RemoveByPattern(cacheKey);
8}
9.
Después de publicar las noticias, llame al método estático ClearNewsSetTopNCache() para borrar por la fuerza los elementos originales de la caché TopN, por ejemplo:
1/**//// <resumen>
2/// Publicar (nuevas) noticias
3/// </summary>
4/// <param name="post">Ejemplo de noticias</param>
5/// <returns>Estado de devolución</returns>
6public static int Create (publicación de noticias)
7{
8 estados internos;
9 CommonDataProvider dp=CommonDataProvider.Instancia();
10 dp.CreateUpdateDeleteNews(publicación, DataAction.Create, estado de salida);
11 //Forzar borrar elementos de caché coincidentes
12 ClearNewsSetTopNCache (post.Language, post.ClassCode,Globals.GetSiteSetting.NewsListTopN);
13 estados de devolución;
14}
Eso es todo. Si hay algún problema, espero que todos los colegas me corrijan.
http://www.cnblogs.com/aspsir/archive/2006/07/27/461229.html