Embora estejamos na era da banda larga e os gatinhos tenham nos deixado gradualmente, como desenvolvedores de aplicativos WEB, ainda temos a responsabilidade e a obrigação de otimizar continuamente o desempenho dos aplicativos WEB por meios técnicos para que os usuários possam esperar menos enquanto navegam.
Felizmente, o ASP.NET, como uma tecnologia de desenvolvimento WEB baseada no .Net Framework, também desfruta das vantagens do .Net Framework. O .Net Framework nos fornece uma boa tecnologia de cache, permitindo-nos desenvolver aplicativos WEB melhores e mais rápidos e fáceis de usar. O namespace System.Web.Caching fornece a classe Cache, cuja eficácia depende das três situações a seguir:
1. Ponto no tempo (válido dentro do ponto no tempo especificado);
2. Valor KEY (o valor KEY é usado como identificador de item de cache);
3. Arquivo ou diretório (se o arquivo ou diretório especificado for alterado, o item original do Cache não estará disponível);
A seguir, compartilharei com vocês como usar o Cache para melhorar o desempenho de aplicativos ASP.NET com base em aplicativos reais desenvolvidos.
No desenvolvimento, muitas vezes encontramos o problema de ler a lista de registros (como a lista de notícias Top N recentemente atualizada) e o próprio registro (como uma notícia quando o usuário acessa, essas informações precisam ser lidas repetidamente). do banco de dados sempre? Se você for inteligente, saberá que isso é completamente desnecessário.
Para facilitar o processamento, podemos também projetar uma classe SiteCache (tirando lições de CSCache.cs em CS) e fornecer vários métodos estáticos para lidar com a adição e exclusão de itens de Cache.
Código:
SiteCache.cs
1usando Sistema;
2usando System.Collections;
3usando System.Text.RegularExpressions;
4usando System.Web;
5usando System.Web.Caching;
6
7namespace Ycweb.Componentes
8{
9 classe pública SiteCache
10 {
11 privado estático somente leitura Cache _cache;
12 public static readonly int DayFactor;
13 fator interno estático privado;
14 public static readonly int HourFactor;
15 public static readonly int MinuteFactor;
16
17 SiteCache estático()
18 {
19DayFactor = 17280;
20 HourFactor = 720;
21 MinuteFactor = 12;
22 Fator = 5;
23 _cache = HttpRuntime.Cache;
vinte e quatro }
25
26 SiteCache privado()
27 {
28}
29
30 vazio estático público Clear()
31 {
32 IDictionaryEnumerator enumerador = _cache.GetEnumerator();
33 enquanto (enumerador.MoveNext())
34 {
35 _cache.Remove(enumerador.Key.ToString());
36}
37}
38
39 objeto estático público Get (chave de string)
40 {
41 return _cache[chave];
42}
43
44 public static void Insert (chave de string, objeto obj)
45 {
46 Inserir(chave, obj, nulo, 1);
47}
48
49 public static void Insert (chave de string, objeto obj, int segundos)
50 {
51 Insert(chave, obj, nulo, segundos);
52}
53
54 public static void Insert (chave de string, objeto obj, CacheDependency dep)
55 {
56 Insert(chave, obj, dep, HourFactor*12);
57}
58
59 public static void Insert (chave de string, objeto obj, int segundos, prioridade CacheItemPriority)
60 {
61 Insert(chave, obj, nulo, segundos, prioridade);
62}
63
64 public static void Insert (string key, object obj, CacheDependency dep, int segundos)
65 {
66 Insert(chave, obj, dep, segundos, CacheItemPriority.Normal);
67}
68
69 public static void Insert (chave de string, objeto obj, CacheDependency dep, int segundos, prioridade CacheItemPriority)
70 {
71 se (obj! = nulo)
72 {
73 _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds((double) (Factor*seconds)), TimeSpan.Zero, prioridade, null);
74}
75}
76
77 public static void Max (chave de string, objeto obj)
78 {
79 Max(chave, obj, nulo);
80}
81
82 public static void Max (chave de string, objeto obj, CacheDependency dep)
83 {
84 se (obj! = nulo)
85 {
86 _cache.Insert(chave, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.AboveNormal, null);
87}
88}
89
90 public static void MicroInsert (chave de string, objeto obj, int secondFactor)
91 {
92 se (obj! = nulo)
93 {
94 _cache.Insert(key, obj, null, DateTime.Now.AddSeconds((double) (Factor*secondFactor)), TimeSpan.Zero);
95}
96}
97
98 public static void Remove (chave de string)
99 {
100 _cache.Remove(chave);
101}
102
103 public static void RemoveByPattern (padrão de string)
104 {
105 IDictionaryEnumerator enumerador = _cache.GetEnumerator();
106 Regex regex1 = novo Regex(padrão, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
107 enquanto (enumerador.MoveNext())
108 {
109 se (regex1.IsMatch(enumerador.Key.ToString()))
110 {
111 _cache.Remove(enumerador.Key.ToString());
112}
113}
114}
115
116 público estático void ReSetFactor(int cacheFactor)
117 {
118 Fator = cacheFator;
119}
120
121
122
123}
124}
Na verdade, esta classe usa principalmente o primeiro e o segundo recursos das dependências de Cache mencionados acima para manter nossos próprios itens de Cache.
Agora que temos a classe SiteCache, vamos ver como utilizá-la. Ou leia a lista de notícias TonN como exemplo:
1public static RecordSet GetNewsSetTopN(string classCode,int topN,SortPostsBy orderBy, SortOrder sortOrder, linguagem de string)
2{
3 string cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}:OB:{3}:SO:{4}", idioma,classCode,topN.ToString( ), orderBy.ToString(),sortOrder.ToString());
4
5 //Lê itens de cache do contexto
6 RecordSet newsSet = HttpContext.Current.Items[cacheKey] como RecordSet;
7 if (newsSet == nulo)
8 {
9 //Lê itens de cache de HttpRuntime.Cache
10 newsSet = SiteCache.Get(cacheKey) como RecordSet;
11 if (newsSet == nulo)
12 {
13 //Leia diretamente do banco de dados
14 CommonDataProvider dp=CommonDataProvider.Instance();
15 newsSet =dp.GetNewsSetTopN(idioma,classCode,topN,orderBy,sortOrder);
16 //E armazene em cache os resultados em HttpRuntime.Cache
17 SiteCache.Insert(cacheKey, newsSet, 60, CacheItemPriority.Normal);
18}
19
20}
21conjunto de notícias de retorno;
vinte e dois}
Desta forma, não há necessidade de acessar repetidamente o banco de dados para ler a lista em 5 minutos. Claro, algumas pessoas perguntarão: e se uma determinada notícia for excluída ou modificada dentro desses 5 minutos? Podemos excluí-lo ou modificá-lo. Excluir à força o item de Cache com base na CHAVE de Cache. Claro, se você acha que não se importa particularmente com a atualidade da lista, não pode excluir à força o item de Cache e deixar o Cache. item expira automaticamente no horário definido. Obviamente, é melhor fornecer um método para excluir à força itens de cache com base em itens padrão correspondentes, por exemplo:
1/**//// <resumo>
2 /// Exclua os itens de cache da lista NewsSetTopN correspondente
3/// </sumário>
4public static void ClearNewsSetTopNCache(string idioma,string classCode,int topN)
5{
6 string cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}",idioma,classCode,topN.ToString());
7 SiteCache.RemoveByPattern(cacheKey);
8}
9.
Após publicar a notícia, chame o método estático ClearNewsSetTopNCache() para limpar à força os itens originais do cache TopN, por exemplo:
1/**//// <resumo>
2 /// Publicar (novas) notícias
3/// </sumário>
4/// <param name="post">Exemplo de notícias</param>
5/// <returns>Status do retorno</returns>
6public static int Criar (postagem de notícias)
7{
8 status interno;
9 CommonDataProvider dp=CommonDataProvider.Instance();
10 dp.CreateUpdateDeleteNews(post, DataAction.Create, status de saída);
11 //Força a limpeza dos itens de cache correspondentes
12 ClearNewsSetTopNCache (post.Language, post.ClassCode,Globals.GetSiteSetting.NewsListTopN);
13 status de retorno;
14}
Isso é tudo. Se houver algo errado, espero que todos os colegas me corrijam.
http://www.cnblogs.com/aspsir/archive/2006/07/27/461229.html