現在はブロードバンド時代を迎え、徐々に人は離れていきますが、WEB アプリケーション開発者としては、ユーザーがより快適に閲覧できるよう、技術的手段を通じて WEB アプリケーションのパフォーマンスを継続的に最適化する責任と義務があります。
幸いなことに、.Net Framework に基づく WEB 開発テクノロジである ASP.NET は、.Net Framework の優れたキャッシュ テクノロジを提供し、より高速でユーザー フレンドリーな、より優れた WEB アプリケーションの開発を可能にします。名前空間 System.Web.Caching は Cache クラスを提供します。このクラスの有効性は次の 3 つの状況によって異なります。
1. 時点 (指定された時点内で有効);
2. KEY 値 (KEY 値はキャッシュ項目識別子として使用されます);
3. ファイルまたはディレクトリ (指定されたファイルまたはディレクトリが変更されると、元のキャッシュ項目は使用できなくなります)。
次に、実際に開発されたアプリケーションに基づいて、キャッシュを使用して ASP.NET アプリケーションのパフォーマンスを向上させる方法を紹介します。
開発中、レコード リスト (最近更新されたニュース リストのトップ 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 private static readonly キャッシュ _cache;
12 public static readonly int DayFactor;
13 private static int 係数。
14 public static readonly int HourFactor;
15 public static readonly int MinuteFactor;
16
17 静的 SiteCache()
18 {
19DayFactor = 17280;
20 時間係数 = 720;
21 ミニッツファクター = 12;
22 係数 = 5;
23 _cache = HttpRuntime.Cache;
24 }
25
26 プライベート SiteCache()
27 {
28 }
29
30 パブリック静的 void Clear()
31 {
32 IDictionaryEnumerator 列挙子 = _cache.GetEnumerator();
33 while (列挙子.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 挿入(キー、オブジェクト、null、1);
47 }
48
49 public static void Insert(文字列キー、オブジェクトobj、int秒)
50{
51 挿入(キー、オブジェクト、ヌル、秒);
52 }
53
54 public static void Insert(文字列キー、オブジェクトobj、CacheDependency dep)
55 {
56 Insert(key, obj, dep, HourFactor*12);
57 }
58
59 public static void Insert(文字列キー、オブジェクトobj、int秒、CacheItemPriority優先度)
60 {
61 Insert(キー、obj、null、秒、優先度);
62 }
63
64 public static void Insert(string key, object obj, CacheDependency dep, int 秒)
65 {
66 Insert(key、obj、dep、秒、CacheItemPriority.Normal);
67 }
68
69 public static void Insert(string key, object obj, CacheDependency dep, int 秒, CacheItemPriority priority)
70 {
71 if (obj != null)
72 {
73 _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds((double) (Factor*秒)), TimeSpan.Zero, priority, null);
74}
75 }
76
77 public static void Max(文字列キー, オブジェクトオブジェクト)
78 {
79 Max(キー、オブジェクト、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(string key, object 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 Remove(文字列キー)
99 {
100 _cache.Remove(キー);
101 }
102
103 public static void RemoveByPattern(文字列パターン)
104 {
105 IDictionaryEnumerator 列挙子 = _cache.GetEnumerator();
106 正規表現 regex1 = 新しい Regex(パターン, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
107 while (列挙子.MoveNext())
108 {
109 if (regex1.IsMatch(enumerator.Key.ToString()))
110 {
111 _cache.Remove(enumerator.Key.ToString());
112 }
113 }
114 }
115
116 パブリック静的無効ReSetFactor(intcacheFactor)
117 {
118 係数 = キャッシュ係数;
119 }
120
121
122
123 }
124}
実際、このクラスは主に、上記のキャッシュ依存関係の 1 番目と 2 番目の機能を使用して、独自のキャッシュ項目を維持します。
SiteCache クラスを作成したので、その使用方法を見てみましょう。または、ニュースの TonN リストを例として読んでみましょう。
1public static RecordSet GetNewsSetTopN(string classCode,int topN,SortPostsBy orderBy, SortOrder sortOrder, string language)
2{
3 stringcacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}:OB:{3}:SO:{4}", language,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(言語,クラスコード,トップN,オーダーバイ,ソートオーダー);
16 //そして結果を HttpRuntime.Cache にキャッシュします
17 SiteCache.Insert(cacheKey, newsSet, 60, CacheItemPriority.Normal);
18}
19
20}
21リターンニュースセット;
22}
この方法では、5 分以内にリストを読むためにデータベースに繰り返しアクセスする必要はありません。もちろん、この 5 分以内に特定のニュース項目が削除または変更された場合はどうなるのかと疑問に思う人もいるでしょう。キャッシュ キーに基づいてキャッシュ アイテムを強制的に削除または変更できます。もちろん、リストの適時性を特に気にしない場合は、キャッシュ アイテムを強制的に削除してキャッシュをそのままにすることはできません。アイテムは定義された時間に自動的に期限切れになります。もちろん、一致するパターン項目に基づいてキャッシュ項目を強制的に削除するメソッドを提供することが最善です。次に例を示します。
1/**//// <概要>
2/// 一致する NewsSetTopN リストのキャッシュ項目を削除します
3/// </概要>
4public static void ClearNewsSetTopNCache(文字列言語,文字列クラスコード,int topN)
5{
6 文字列cacheKey = 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/// <param name="post">ニュースの例</param>
5/// <returns>返品ステータス</returns>
6public static int Create(ニュース投稿)
7{
8 int ステータス。
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