Хотя сейчас мы живем в эпоху широкополосного доступа, и котята постепенно покинули нас, как разработчиков веб-приложений, мы по-прежнему несем ответственность и обязаны постоянно оптимизировать производительность веб-приложений с помощью технических средств, чтобы пользователи могли меньше ждать во время просмотра.
К счастью, ASP.NET, как технология веб-разработки, основанная на .Net Framework, также обладает преимуществами .Net Framework. .Net Framework предоставляет нам хорошую технологию кэширования, позволяющую разрабатывать более быстрые и удобные для пользователя веб-приложения. Пространство имен System.Web.Caching предоставляет класс Cache, эффективность которого зависит от следующих трех ситуаций:
1. Момент времени (действителен в течение указанного момента времени);
2. Значение KEY (значение KEY используется как идентификатор элемента кэша);
3. Файл или каталог (если указанный файл или каталог изменится, исходный элемент Кэша будет недоступен);
Далее я расскажу вам, как использовать Cache для повышения производительности приложений ASP.NET на основе реально разработанных приложений.
При разработке мы часто сталкиваемся с проблемой чтения списка записей (например, недавно обновленного списка новостей Top N) и самой записи (например, фрагмента новости), нужно ли при доступе пользователя читать такую информацию повторно? из базы данных каждый раз? Если вы умны, то, возможно, знаете, что в этом нет никакой необходимости.
Чтобы облегчить обработку, мы могли бы также разработать класс SiteCache (извлекая уроки из CSCache.cs в CS) и предоставить несколько статических методов для обработки добавления и удаления элементов Cache.
Код:
SiteCache.cs
1использование системы;
2использование System.Collections;
3с использованием System.Text.RegularExpressions;
4использование System.Web;
5использование System.Web.Caching;
6
7пространство имен Ycweb.Components
8{
9 общедоступный класс SiteCache
10 {
11 частный статический кэш только для чтения _cache;
12 public static readonly int DayFactor;
13 частный статический int Фактор;
14 public static readonly int HourFactor;
15 public static readonly int MinuteFactor;
16
17 статический SiteCache()
18 {
19ДэйФактор = 17280;
20-часовой фактор = 720;
21-минутный фактор = 12;
22 Фактор = 5;
23 _cache = HttpRuntime.Cache;
двадцать четыре }
25
26 частных SiteCache()
27 {
28 }
29
30 public static void Clear()
31 {
32 Перечислитель IDictionaryEnumerator = _cache.GetEnumerator();
33 пока (enumerator.MoveNext())
34 {
35 _cache.Remove(enumerator.Key.ToString());
36}
37 }
38
39 общедоступный статический объект Get (строковый ключ)
40 {
41 вернуть _cache[ключ];
42 }
43
44 public static void Insert (строковый ключ, объект obj)
45 {
46 Вставить(ключ, объект, ноль, 1);
47 }
48
49 public static void Insert (строковый ключ, объект obj, целое число секунд)
50 {
51 Insert(ключ, объект, ноль, секунды);
52 }
53
54 public static void Insert (строковый ключ, объект obj, dep CacheDependency)
55 {
56 Insert(key, obj, dep, HourFactor*12);
57 }
58
59 public static void Insert (строковый ключ, объект obj, целое число секунд, приоритет CacheItemPriority)
60 {
61 Insert(ключ, объект, ноль, секунды, приоритет);
62 }
63
64 public static void Insert (строковый ключ, объект obj, CacheDependency dep, int секунды)
65 {
66 Insert(key, obj, dep, секунды, CacheItemPriority.Normal);
67 }
68
69 public static void Insert (строковый ключ, объект obj, CacheDependency dep, целое число секунд, приоритет CacheItemPriority)
70 {
71 если (obj != ноль)
72 {
73 _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds((double) (Фактор*секунды)), TimeSpan.Zero, Priority, null);
74}
75 }
76
77 public static void Max (строковый ключ, объект obj)
78 {
79 Макс (ключ, объект, ноль);
80}
81
82 public static void Max (строковый ключ, объект obj, dep CacheDependency)
83 {
84 если (obj != ноль)
85 {
86 _cache.Insert(key, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.AboveNormal, null);
87 }
88}
89
90 public static void MicroInsert (строковый ключ, объект obj, int SecondFactor)
91 {
92 если (obj != ноль)
93 {
94 _cache.Insert(key, obj, null, DateTime.Now.AddSeconds((double) (Factor* SecondFactor)), TimeSpan.Zero);
95 }
96 }
97
98 public static void Remove (строковый ключ)
99 {
100 _cache.Remove(ключ);
101 }
102
103 public static void RemoveByPattern (строковый шаблон)
104 {
105 Перечислитель IDictionaryEnumerator = _cache.GetEnumerator();
106 Regex regex1 = новое Regex(шаблон, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
107 пока (enumerator.MoveNext())
108 {
109, если (regex1.IsMatch(enumerator.Key.ToString()))
110 {
111 _cache.Remove(enumerator.Key.ToString());
112 }
113 }
114 }
115
116 public static void ReSetFactor(intcacheFactor)
117 {
118 Фактор = кэшФактор;
119 }
120
121
122
123 }
124}
Фактически, этот класс в основном использует первую и вторую функции зависимостей Cache, упомянутые выше, для поддержки наших собственных элементов Cache.
Теперь, когда у нас есть класс SiteCache, давайте посмотрим, как его использовать. Или возьмем, к примеру, чтение списка новостей TonN:
1 публичный статический набор записей GetNewsSetTopN (строка classCode, int topN, SortPostsBy orderBy, SortOrder sortOrder, строковый язык)
2{
3-строчный кэшКей = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}:OB:{3}:SO:{4}", язык,classCode,topN.ToString( ), orderBy.ToString(),sortOrder.ToString());
4
5 //Чтение элементов кэша из контекста
6 RecordSet newsSet = HttpContext.Current.Items[cacheKey] as RecordSet;
7, если (newsSet == null)
8 {
9 //Чтение элементов кэша из HttpRuntime.Cache
10 newsSet = SiteCache.Get(cacheKey) как RecordSet;
11, если (newsSet == ноль)
12 {
13 //Чтение напрямую из базы данных
14 CommonDataProvider dp=CommonDataProvider.Instance();
15 newsSet =dp.GetNewsSetTopN(language,classCode,topN,orderBy,sortOrder);
16 //И кэшируем результаты в HttpRuntime.Cache
17 SiteCache.Insert(cacheKey, newsSet, 60, CacheItemPriority.Normal);
18}
19
20}
21 возврат новостейSet;
двадцать два}
Таким образом, нет необходимости повторно обращаться к базе данных, чтобы прочитать список в течение 5 минут. Конечно, некоторые люди спросят, а что, если определенная новость будет удалена или изменена в течение этих 5 минут? Это не имеет значения. Мы можем удалить или изменить его. Принудительно удалить элемент Кэша на основе КЛЮЧА КЕША. Конечно, если вы чувствуете, что вас не особенно заботит актуальность списка, вы не можете принудительно удалить элемент Кэша и оставить Кэш. срок действия элемента автоматически истекает в указанное время. Конечно, лучше всего предоставить метод принудительного удаления элементов кэша на основе совпадения элементов шаблона, например:
1/**//// <сводка>
2/// Удалите элементы кэша соответствующего списка NewsSetTopN.
3/// сводка>
4public static void ClearNewsSetTopNCache (строковый язык, строковый classCode, int topN)
5{
6-строчный кэшКей = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}",language,classCode,topN.ToString());
7 SiteCache.RemoveByPattern(cacheKey);
8}
9.
После публикации новости вызовите статический метод ClearNewsSetTopNCache(), чтобы принудительно очистить исходные элементы кэша TopN, например:
1/**//// <сводка>
2/// Публикация (новых) новостей
3/// сводка>
4/// Пример новости
5///
6public static int Create (сообщение новостей)
7{
8 внутренний статус;
9 CommonDataProvider dp=CommonDataProvider.Instance();
10 dp.CreateUpdateDeleteNews(post, DataAction.Create, статус выхода);
11 //Принудительно очистить соответствующие элементы кэша
12 ClearNewsSetTopNCache (post.Language, post.ClassCode,Globals.GetSiteSetting.NewsListTopN);
13 статус возврата;
14}
На этом все. Если что-то не так, надеюсь, все коллеги меня поправят.
http://www.cnblogs.com/aspsir/archive/2006/07/27/461229.html