Webサイト最適化ページ・レベルのキャッシュ・スキーム
22479 ワード
キャッシュでWebサイトのパフォーマンスを最適化する方法は、誰も知らないと思います.ASP.NETはHttpRuntimeを提供する.Cacheオブジェクトはデータをキャッシュし、OutputCacheコマンドも提供してページ出力全体をキャッシュします.OutputCache命令は使いやすく、非常に良い効果もありますが、それらのページにこのような命令を追加する必要があります.
OutputCacheが設定されているページでは、ブラウザはこのようなページの応答を受信すると、ページ応答内容をキャッシュします.指定したキャッシュ時間内に、ユーザーが強制的にリフレッシュする操作がなければ、サービス側は再要求されず、他のブラウザからのリクエストに対してキャッシュ・ページが生成された場合、キャッシュから直接リクエストに応答し、応答速度を速めることができます.したがって、OutputCache命令は、すべてのページが頻繁に更新されない限り、パフォーマンスの最適化にとって意味があります.
Webサイトの最適化の段階では、Fiddlerなどのツールを使用して、ほとんど変更されないページを特定し、OutputCacheを設定することができますが、従来の開発プロセスでは、ページファイルごとに次の操作を行う必要があります.
リストページの出力キャッシュ宣言を構成します. ページによって異なるクエリーパラメータによって異なるページをキャッシュする E.g.は同様にリストページであり、1ページに分類される.http://www.wedn.net/cat/1/分類2ページ:http://www.wedn.net/cat/2/それぞれ異なるキャッシュオブジェクト にキャッシュする.
構成が簡単、 は、本来のシステムに侵入する、 .アクセス速度は非常に速い(実行結果をメモリにキャッシュするため) .
はリソースが多く、すべてのページをキャッシュできません. では、使用時間が長くなるとアクセスキャッシュ速度が遅くなるという問題が解決されていません.
開発カスタムProviderプログラムはASPに提供する.NET呼び出しデアクセス出力キャッシュ; 残りの同方式一 は、キャッシュの読み書き、 を自主的に制御することができる.既存システムに侵入することなく、 .アクセス高速 配置が比較的複雑で、 Provider の開発が必要追加リソース(分散キャッシュ) が必要
実現原理:
実装方法:抽象ベースクラスOutputCacheProviderの削除方法を実現する. 大まかなコード(簡単にファイル読み書き、JSONシーケンス化とバイナリシーケンス化で実現)を添付し、構想は参考まで: OutputCacheProvider
OutputCacheが設定されているページでは、ブラウザはこのようなページの応答を受信すると、ページ応答内容をキャッシュします.指定したキャッシュ時間内に、ユーザーが強制的にリフレッシュする操作がなければ、サービス側は再要求されず、他のブラウザからのリクエストに対してキャッシュ・ページが生成された場合、キャッシュから直接リクエストに応答し、応答速度を速めることができます.したがって、OutputCache命令は、すべてのページが頻繁に更新されない限り、パフォーマンスの最適化にとって意味があります.
Webサイトの最適化の段階では、Fiddlerなどのツールを使用して、ほとんど変更されないページを特定し、OutputCacheを設定することができますが、従来の開発プロセスでは、ページファイルごとに次の操作を行う必要があります.
方式一、ASPを使用する.NETプラットフォームが提供するOutputCache(ランタイムメモリ)メカニズム
実装方法:
メリット:
欠点:
方式二、同じくASPを使用する.NETプラットフォームが提供するOutputCache(カスタムProvider)メカニズム
実装方法:
メリット:
欠点:
添付:
カスタムOutputCacheProviderインプリメンテーション出力キャッシュを分散キャッシュに格納
実現原理:
実装方法:
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.IO;
5 using System.Linq;
6 using System.Runtime.Serialization.Formatters.Binary;
7 using System.Security.Cryptography;
8 using System.Text;
9 using System.Web.Caching;
10 using Micua.Utility;
11 namespace Micua.UI.Cache
12 {
13 public class MicuaOutputCacheProvider : OutputCacheProvider, IDisposable
14 {
15 readonly IList<CacheItem> _cacheItems;
16 public MicuaOutputCacheProvider()
17 {
18 if (File.Exists("z:\\cache.json"))
19 {
20 var json = File.ReadAllText("z:\\cache.json");
21 _cacheItems = JsonHelper.Deserialize<List<CacheItem>>(json) ?? new List<CacheItem>();
22 }
23 else
24 {
25 _cacheItems = new List<CacheItem>();
26 }
27 }
28 public override object Get(string key)
29 {
30 Debug.WriteLine(string.Format("Cache.Get({0})", key));
31 key = MD5(key);
32 var cacheItem = _cacheItems.FirstOrDefault(c => c.Id == key);
33 if (cacheItem != null)
34 {
35 if (cacheItem.Expiration.ToUniversalTime() <= DateTime.UtcNow)
36 {
37 _cacheItems.Remove(cacheItem);
38 }
39 else
40 {
41 return Deserialize(cacheItem.Item);
42 }
43 }
44 return null;
45 }
46 public override object Add(string key, object entry, DateTime utcExpiry)
47 {
48 Debug.WriteLine("Cache.Add({0}, {1}, {2})", key, entry, utcExpiry);
49 key = MD5(key);
50 if (utcExpiry == DateTime.MaxValue)
51 utcExpiry = DateTime.UtcNow.AddMinutes(5);
52 var item = _cacheItems.FirstOrDefault(c => c.Id == key);
53 if (item != null)
54 {
55 if (item.Expiration.ToUniversalTime() <= DateTime.UtcNow)
56 {
57 _cacheItems.Remove(item);
58 }
59 else
60 {
61 SaveChange();
62 return Deserialize(item.Item);
63 }
64 }
65 _cacheItems.Add(new CacheItem
66 {
67 Id = key,
68 Item = Serialize(entry),
69 Expiration = utcExpiry
70 });
71 SaveChange();
72 return entry;
73 }
74 public override void Set(string key, object entry, DateTime utcExpiry)
75 {
76 Debug.WriteLine("Cache.Set({0}, {1}, {2})", key, entry, utcExpiry);
77 key = MD5(key);
78 var item = _cacheItems.FirstOrDefault(c => c.Id == key);
79 if (item != null)
80 {
81 _cacheItems.Remove(item);
82 item.Item = Serialize(entry);
83 item.Expiration = utcExpiry;
84 _cacheItems.Add(item);
85 }
86 else
87 {
88 _cacheItems.Add(new CacheItem
89 {
90 Id = key,
91 Item = Serialize(entry),
92 Expiration = utcExpiry
93 });
94 }
95 SaveChange();
96 }
97 public override void Remove(string key)
98 {
99 Debug.WriteLine("Cache.Remove({0})", key);
100 key = MD5(key);
101 _cacheItems.Remove(_cacheItems.FirstOrDefault(c => c.Id == key));
102 SaveChange();
103 }
104 private static string MD5(string value)
105 {
106 var cryptoServiceProvider = new MD5CryptoServiceProvider();
107 var bytes = Encoding.UTF8.GetBytes(value);
108 var builder = new StringBuilder();
109 bytes = cryptoServiceProvider.ComputeHash(bytes);
110 foreach (var b in bytes)
111 builder.Append(b.ToString("x2").ToLower());
112 return builder.ToString();
113 }
114 private static byte[] Serialize(object entry)
115 {
116 var formatter = new BinaryFormatter();
117 var stream = new MemoryStream();
118 formatter.Serialize(stream, entry);
119 return stream.ToArray();
120 }
121 private static object Deserialize(byte[] serializedEntry)
122 {
123 var formatter = new BinaryFormatter();
124 var stream = new MemoryStream(serializedEntry);
125 return formatter.Deserialize(stream);
126 }
127 private void SaveChange()
128 {
129 var json = JsonHelper.Serialize(_cacheItems);
130 File.WriteAllText("z:\\cache.json", json);
131 }
132 public void Dispose()
133 {
134 var json = JsonHelper.Serialize(_cacheItems);
135 File.WriteAllText("z:\\cache.json", json);
136 }
137 }
138 }