Webサイト最適化ページ・レベルのキャッシュ・スキーム

22479 ワード

キャッシュでWebサイトのパフォーマンスを最適化する方法は、誰も知らないと思います.ASP.NETはHttpRuntimeを提供する.Cacheオブジェクトはデータをキャッシュし、OutputCacheコマンドも提供してページ出力全体をキャッシュします.OutputCache命令は使いやすく、非常に良い効果もありますが、それらのページにこのような命令を追加する必要があります.
OutputCacheが設定されているページでは、ブラウザはこのようなページの応答を受信すると、ページ応答内容をキャッシュします.指定したキャッシュ時間内に、ユーザーが強制的にリフレッシュする操作がなければ、サービス側は再要求されず、他のブラウザからのリクエストに対してキャッシュ・ページが生成された場合、キャッシュから直接リクエストに応答し、応答速度を速めることができます.したがって、OutputCache命令は、すべてのページが頻繁に更新されない限り、パフォーマンスの最適化にとって意味があります.
Webサイトの最適化の段階では、Fiddlerなどのツールを使用して、ほとんど変更されないページを特定し、OutputCacheを設定することができますが、従来の開発プロセスでは、ページファイルごとに次の操作を行う必要があります.

方式一、ASPを使用する.NETプラットフォームが提供するOutputCache(ランタイムメモリ)メカニズム


実装方法:

  • リストページの出力キャッシュ宣言を構成します.
  • ページによって異なるクエリーパラメータによって異なるページをキャッシュする
  • E.g.は同様にリストページであり、1ページに分類される.http://www.wedn.net/cat/1/分類2ページ:http://www.wedn.net/cat/2/それぞれ異なるキャッシュオブジェクト
  • にキャッシュする.

    メリット:

  • 構成が簡単、
  • は、本来のシステムに侵入する、
  • .
  • アクセス速度は非常に速い(実行結果をメモリにキャッシュするため)
  • .

    欠点:

  • はリソースが多く、すべてのページをキャッシュできません.
  • では、使用時間が長くなるとアクセスキャッシュ速度が遅くなるという問題が解決されていません.

  • 方式二、同じくASPを使用する.NETプラットフォームが提供するOutputCache(カスタムProvider)メカニズム


    実装方法:

  • 開発カスタムProviderプログラムはASPに提供する.NET呼び出しデアクセス出力キャッシュ;
  • 残りの同方式一
  • メリット:

  • は、キャッシュの読み書き、
  • を自主的に制御することができる.
  • 既存システムに侵入することなく、
  • .
  • アクセス高速
  • 欠点:

  • 配置が比較的複雑で、
  • Provider
  • の開発が必要
  • 追加リソース(分散キャッシュ)
  • が必要

    添付:


    カスタムOutputCacheProviderインプリメンテーション出力キャッシュを分散キャッシュに格納


    実現原理:
    実装方法:
  • 抽象ベースクラスOutputCacheProviderの削除方法を実現する.
  • 大まかなコード(簡単にファイル読み書き、JSONシーケンス化とバイナリシーケンス化で実現)を添付し、構想は参考まで:
  • 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 }