지금은 광대역 시대이고 새끼 고양이가 점차 우리를 떠나고 있지만, 웹 애플리케이션 개발자로서 우리는 여전히 기술적 수단을 통해 웹 애플리케이션 성능을 지속적으로 최적화하여 사용자가 탐색하는 동안 더 빨리 기다릴 수 있도록 하는 책임과 의무가 있습니다.
다행스럽게도 ASP.NET은 .Net Framework 기반의 WEB 개발 기술로서 .Net Framework의 장점도 누리고 있습니다. .Net Framework는 우수한 캐시 기술을 제공하여 더 빠르고 사용자 친화적인 WEB 응용 프로그램을 개발할 수 있도록 해줍니다. System.Web.Caching 네임스페이스는 Cache 클래스를 제공하며 그 효과는 다음 세 가지 상황에 따라 달라집니다.
1. 시점(지정된 시점 내에서 유효함)
2. KEY 값(KEY 값은 캐시 항목 식별자로 사용됨);
3. 파일 또는 디렉터리(지정된 파일 또는 디렉터리가 변경되면 원래 캐시 항목을 사용할 수 없음)
다음으로는 실제 개발된 응용프로그램을 기반으로 Cache를 활용하여 ASP.NET 응용프로그램의 성능을 향상시키는 방법을 알려드리겠습니다.
개발 과정에서 레코드 목록(예: 최근 업데이트된 뉴스 목록 Top N)과 레코드 자체(예: 뉴스)를 읽는 문제에 자주 직면합니다. 사용자가 액세스하면 해당 정보를 반복해서 읽어야 합니까? 매번 데이터베이스에서? 당신이 똑똑하다면 이것이 전혀 불필요하다는 것을 알 수 있습니다.
처리를 용이하게 하기 위해 SiteCache 클래스(CS의 CSCache.cs에서 학습)를 설계하고 캐시 항목의 추가 및 삭제를 처리하는 여러 정적 메서드를 제공할 수도 있습니다.
암호:
SiteCache.cs
1사용 시스템;
2System.Collections 사용;
3System.Text.RegularExpressions 사용;
4System.Web 사용;
5System.Web.Caching 사용;
6
7네임스페이스 Ycweb.Components
8{
9 공개 클래스 SiteCache
10 {
11 개인 정적 읽기 전용 Cache _cache;
12 공개 정적 읽기 전용 int DayFactor;
13 개인 정적 정수 인수;
14 공개 정적 읽기 전용 int HourFactor;
15 공개 정적 읽기 전용 int MinuteFactor;
16
17 정적 사이트캐시()
18 {
19DayFactor = 17280;
20시간 인자 = 720;
21 MinuteFactor = 12;
22 인자 = 5;
23 _cache = HttpRuntime.캐시;
스물넷 }
25
26 개인 사이트캐시()
27 {
28 }
29
30 공개 정적 무효 Clear()
31 {
32 IDictionaryEnumerator 열거자 = _cache.GetEnumerator();
33 while(enumerator.MoveNext())
34 {
35 _cache.Remove(enumerator.Key.ToString());
36}
37 }
38
39 공개 정적 객체 Get(문자열 키)
40 {
41 return _cache[키];
42 }
43
44 public static void Insert(문자열 키, 객체 obj)
45 {
46 삽입(키, obj, null, 1);
47 }
48
49 public static void Insert(문자열 키, 객체 obj, int 초)
50 {
51 Insert(키, obj, null, 초);
52 }
53
54 public static void Insert(문자열 키, 객체 obj, CacheDependency dep)
55 {
56 Insert(키, obj, 깊이, HourFactor*12);
57 }
58
59 public static void Insert(문자열 키, 객체 obj, int 초, CacheItemPriority 우선 순위)
60 {
61 Insert(키, obj, null, 초, 우선순위);
62 }
63
64 public static void Insert(문자열 키, 객체 obj, CacheDependency dep, int 초)
65 {
66 Insert(키, obj, dep, 초, CacheItemPriority.Normal);
67 }
68
69 public static void Insert(문자열 키, 객체 obj, CacheDependency dep, int 초, CacheItemPriority 우선 순위)
70 {
71 만약 (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(문자열 키, 객체 obj)
78 {
79 최대(키, obj, null);
80}
81
82 public static void Max(문자열 키, 객체 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(문자열 키, 객체 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 제거(문자열 키)
99 {
100 _cache.Remove(키);
101 }
102
103 공개 정적 무효 RemoveByPattern(문자열 패턴)
104 {
105 IDictionaryEnumerator 열거자 = _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 캐시팩터)
117 {
118인자 = 캐시인자;
119 }
120
121
122
123 }
124}
실제로 이 클래스는 위에서 언급한 캐시 종속성의 첫 번째 및 두 번째 기능을 주로 사용하여 자체 캐시 항목을 유지합니다.
이제 SiteCache 클래스가 있으므로 이를 사용하는 방법을 살펴보겠습니다. 또는 뉴스 TonN 목록을 예로 들어보세요.
1public static RecordSet GetNewsSetTopN(string 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 if (newsSet == null)
8 {
9 //HttpRuntime.Cache에서 캐시 항목 읽기
10 newsSet = SiteCache.Get(cacheKey) as RecordSet;
11 if (newsSet == null)
12 {
13 //데이터베이스에서 직접 읽기
14 CommonDataProvider dp=CommonDataProvider.Instance();
15 newsSet =dp.GetNewsSetTopN(언어,classCode,topN,orderBy,sortOrder);
16 //그리고 결과를 HttpRuntime.Cache에 캐시합니다.
17 SiteCache.Insert(cacheKey, newsSet, 60, CacheItemPriority.Normal);
18}
19
20}
21반환 뉴스세트;
스물둘}
이렇게 하면 5분 이내에 목록을 읽기 위해 반복적으로 데이터베이스에 액세스할 필요가 없습니다. 물론 어떤 사람들은 이 5분 내에 특정 뉴스 항목이 삭제되거나 수정되면 어떻게 되는지 묻습니다. Cache KEY를 기준으로 Cache 항목을 강제로 삭제하거나 수정할 수 있습니다. 물론 목록의 적시성에 특별히 신경 쓰지 않는다고 느끼면 Cache 항목을 강제로 삭제하고 Cache를 놔둘 수는 없습니다. 항목은 정의된 시간에 자동으로 만료됩니다. 물론 일치하는 패턴 항목을 기반으로 캐시 항목을 강제로 삭제하는 방법을 제공하는 것이 가장 좋습니다. 예를 들면 다음과 같습니다.
1/**//// <요약>
2/// 일치하는 NewsSetTopN 목록의 캐시 항목을 삭제합니다.
3/// </summary>
4public static void ClearNewsSetTopNCache(문자열 언어, 문자열 classCode,int topN)
5{
6 문자열 캐시키 = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}",언어,classCode,topN.ToString());
7 SiteCache.RemoveByPattern(cacheKey);
8}
9.
뉴스를 게시한 후 정적 메서드 ClearNewsSetTopNCache()를 호출하여 원래 TopN 캐시 항목을 강제로 지웁니다. 예를 들면 다음과 같습니다.
1/**//// <요약>
2/// (신규) 뉴스 게시
3/// </summary>
4/// <param name="post">뉴스 예시</param>
5/// <returns>반품 상태</returns>
6public static int Create(뉴스 게시물)
7{
8 정수 상태;
9 CommonDataProvider dp=CommonDataProvider.Instance();
10 dp.CreateUpdateDeleteNews(post, DataAction.Create, out status);
11 //일치하는 캐시 항목 강제 삭제
12 ClearNewsSetTopNCache(post.Language, post.ClassCode,Globals.GetSiteSetting.NewsListTopN);
13 반환 상태;
14}
그게 다입니다. 잘못된 점이 있으면 동료 모두가 바로잡아 주기를 바랍니다.
http://www.cnblogs.com/aspsir/archive/2006/07/27/461229.html