1. ASP キャッシュとは何ですか?なぜキャッシュする必要があるのですか?
初期段階で ASP テクノロジを使用して Web サイトを構築すると、ASP 動的 Web ページ テクノロジによってもたらされる利便性、および変更の自由や http コントロールの自由さを感じるかもしれません。ただし、アクセス数が増えると、サイトのアクセス速度がどんどん遅くなり、IIS が再起動する頻度が高くなることは間違いありません。次に、データベースをよりパフォーマンスの高いものに置き換えたり、インデックスを作成したり、ストアド プロシージャを作成したりするなど、ASP を最適化する必要があります。これらの対策の中には、コストの増加を必要としないものもありますが、大幅なコストの圧力を必要とするもの (SQL へのクラスタリング アクセスなど) もあり、その効果は必ずしも確実ではありません。
Web アクセスのプレッシャーに直面した場合、最も経済的な方法は、キャッシュ最適化テクノロジーを使用して Web サービスのプレッシャーを軽減することだと思います。
Web トラフィックの増加は、多くの場合、次のリソースに対する需要の急速な増加を意味します。
1. ネットワーク カード トラフィックの増加により、ネットワーク トラフィックとネットワーク I/O スレッドを処理するためにより多くの CPU が必要になります。
2. データベース接続をより頻繁に開閉する必要性 (データベース テクノロジが使用されている場合 - 通常、ASP はデータベースをデータ ストレージとして使用します)、リソースを大幅に消費するものの数、およびリソースの競合によるトランザクションによって引き起こされるデッドロックにより、ネットワーク I/O が増加します。 O または CPU 消費量。
3. セッションが使用されている場合、IIS は状態を維持するためにより多くのメモリを消費します。メモリ消費により物理メモリが不足し、物理メモリと補助メモリの間で頻繁な交換が発生し、コードの実行が一時停止し、Web 応答がブロックされる可能性があります。 。
4. アクセスに対するタイムリーな応答がないため、Web ページへのアクセスが失敗し、ユーザーが更新されることになり、CPU やメモリなどのリソースの需要が増大します。
実際、一般的な Web アプリケーションを考慮すると、多くの場合、動的なコードの実行は不要です。
2.ASPキャッシュの分類
許可なく要約すると、ASP キャッシュは次の 2 つのカテゴリに分類できます。
1. ファイルキャッシュ
いわゆるファイル キャッシュは、特定の ASP の特定の実行が一定期間内に大幅に変更されないという論理的判断に基づいているため、コンテンツは静的 HTML の形式で保存され、Web リダイレクト テクノロジが使用されます。 CPU やデータベース リソースなどの削減のニーズを満たすために、クライアントが静的ファイルにアクセスできるようにします。たとえば、donews.com フォーラムなど、多くのフォーラムでは、投稿に返信するときに投稿全体を静的ファイルに再生成し、リダイレクトします。静的であることの副作用 (利点) もあります。Google などの検索エンジンに簡単に組み込まれる可能性があります。いわゆるニュース リリース システムの一部には、このテクノロジーが採用されています。
2. ファイルフラグメントキャッシュ
いわゆるファイルキャッシュも、データの特定の部分(通常、リソースを必要とする大容量のデータベースクエリによって取得される)は、一定期間内に変更されないため、これらのデータを論理的な判断に基づいて保存できます。必要に応じて、ファイルを読み取ってデータを取得できるため、データベースへの負担が増加しません。たとえば、通常、一部のデータを XML 形式で保存し、次を使用します。これが CSDN フォーラムの処理方法です。
3. メインメモリキャッシュ
さらに、メモリにキャッシュし、タイムリーな応答が必要なコンテンツをメモリに保存し、アクセスが必要になったらすぐに高速ストレージから転送することも検討できます。非常に多くのアクセス要件がいくつかの小さなページに集中している場合、またはメイン メモリが十分な大きさである場合、メイン メモリ キャッシュを使用すると、Web アクセスのパフォーマンスが大幅に向上することが確実にあると思います。
3. キャッシュの実装・利用方法
キャッシュを実装するときは、次の問題を考慮する必要があります。
1. 短期間では変更されないページはどれですか?
自分のサイトを分析してみると、このようなページがたくさんあります。たとえば、Web サイトには通常、ニュースや情報のコラムがあり、これらのコラムは通常、サイト管理者によって 1 日の特定の時間に投稿され、その後ページが変更されることはほとんどありません。したがって、これらのページは静的ファイルのキャッシュに適しています。実際、これはいわゆるニュースリリースシステムが行っていることなので、これらのシステムの考え方を参考にして、オリジナルのダイナミック ASP ページを変革することもできます。
2. これらのページは、すべての訪問者に対して同じロジックを使用して生成されます (つまり、訪問者は区別されません)。
すべての訪問者が同じインターフェイスを参照するニュースや情報などのコラムに加えて、フォーラムなどのリソースを消費するアプリケーションは一般に、統一されたロジックを生成するように設計できます (同じ投稿は 3 人でも 3 人でも同じように表示されます)。このようなアプリケーション ページも、静的キャッシュを使用して実現できます。データを断片化し、スクリプト テクノロジーを使用して、サーバー (クライアント ブラウザー) の処理能力の外でデータを処理することも検討できます。
3. キャッシュを使用するコストと利点。
重要なのは、(応答)時間のためのスペースです。キャッシュ テクノロジを使用して、将来頻繁に必要になるコンテンツを前処理して、Web サーバーの応答性を向上させ、さらに重要なことに、訪問者の好意を獲得します。
その代償として、Web スペースの需要が増加し、同時にアクセス効果に影響が出る可能性があります。
しかし、適切なキャッシュにはデメリットよりもメリットの方が多いと思います。
4. それらの場所はキャッシュに適していません
動的クエリ ページでは、全員のクエリ内容が異なるため、表示結果も異なります。そのため、クエリ結果をキャッシュする可能性が低く、キャッシュがより複雑になり、キャッシュ使用率が低くなり、結果として管理コストが高くなります (キャッシュしたと仮定すると)。クエリキーワードが1000個もある場合、これらのキーワードとキャッシュの対応関係の管理も面倒です)。
4. 分析例
提案フォーラムの元のレイアウトが次のとおりであると仮定します。
ルート ディレクトリの下:
default.asp ホーム ページ、通常はハイライト、推奨事項など。
listBorad.asp このファイルには、すべての列の名前と概要がリストされます。MainBID パラメーターが指定されている場合は、セクションの下の列がリストされることを意味します。
listThread.asp このファイルにパラメーターが含まれていない場合は、すべての投稿がリストされることを意味し、MainBID が含まれる場合は、特定のブロック内のすべての投稿がリストされることを意味します。 subBID が指定されている場合は、特定の列に投稿をリストすることを意味します。 page パラメータが指定されている場合、トピックはページ内にリストされます。
ViewThread.asp は、投稿のコンテンツを一覧表示します。投稿がコメントとして表示され、コメントがあれば最後にリストされることを想定しています。 IDパラメータは表示する投稿です。
Reply.asp は投稿に応答し、投稿に応答するためのパラメーター ID を運びます。
他のものについては今のところ説明しません。
上記のことから、すべてがオリジナルの ASP/PHP を使用して行われる場合、ほぼすべての ASP ファイルの実行にはデータベース操作、頻繁なクエリ、および複数テーブルのクエリが必要であることがわかります。データベースにクエリを実行すると、最終的にパフォーマンスと応答速度の低下につながり、訪問者のブラウジングが遅くなり、Web の品質が低下することを知っておく必要があります。さらに重要なのは、A と B の 2 人が ViewThread.asp などにアクセスすると、ID が同じであれば何度も同じ内容が表示されることです (ブラウザが受信する HTML コードはほぼ同じです)。同じ)、ただし、これについては、同じコンテンツに対して、サーバーはデータベース接続を開き、クエリを実行し、レコードを読み取り、表示し、レコードを閉じ、データベース接続を行う必要があります。 。 。 。サーバー リソースを消費する次の操作にアクセスする人が増えると、最終的には、これらのユーザーがサーバー リソースをより多く消費することになります。実際、同じコンテンツに対するこのような繰り返しの作業は、最適化のためのキャッシュ テクノロジを使用することで回避できます。例えば:
Reply.asp でコンテンツを送信した後、すぐに静的関数を呼び出し、投稿コンテンツ全体を viewThread_xxxx.htm などの静的 HTML ファイルとして保存します。通常の状況では、viewThread.asp?ID=xxxx にアクセスすると、システムは自動的にリダイレクトします。対応する静的ファイル viewThreadxxxx.htm にコピーします。このようにして、投稿に最新のリリースがない場合は、常に静的なコンテンツが閲覧者に提供されます。新しい投稿があると、静的なファイルに更新されます。このようにして、多くのデータベース操作が保存されます。そしてレスポンスが大幅に向上します。
listBorad.asp は静的に実装することもできます。保持するパラメーターを分析し、キャッシュ ファイル名を listBoard_xx.htm に設定し、新しい列を追加するときに listBoard_xxx.htm を更新できます。 listThread.asp も似ていますが、より多くのパラメーターがあるため、大量のキャッシュ ファイルが存在する点が異なります。 listThread.asp?subBID=xxx&page=2 をキャッシュする場合、対応する静的ファイルは listThread_xxx_p2.htm です。同じことがdefault.aspにも当てはまります。
では、いつ更新するかをどうやって判断すればよいのでしょうか?いつ更新されますか?
listThread.asp? subBID=xxx&page=2 については、listThread.asp の実行時に subID と page を抽出し、listThread_xxx_p2.htm が存在するかどうかを検出し、存在しない場合は静的生成関数を呼び出してファイルを生成し、最後にリダイレクトします。ここでは静的ファイルです。ここに存在しないということは、更新する必要がある新しいコンテンツがあることを意味することに注意してください。
では、ファイルが存在しないようにするにはどうすればよいでしょうか?消去。新しい投稿を公開したり、投稿を削除したり、投稿を移動したりすると、listThread_xxx_p2.htm などのすべての静的ファイルを削除できます。これにより、いつキャッシュするかがわかります。
ここで、静的ファイルを生成する方法という疑問が 1 つ残っています。
先ほど述べたことと同じことに注意してください。変換前に、default.asp、listThread.asp などのコピーを、default_d.asp、listThread_2.asp という名前で同じディレクトリ (理論的には listThtrad.asp?s) に作成できます。 ubID=123とLISTtHREAD_D.ASP?SUBID=123のアクセス結果は同じになります)ので、静的ファイルを生成するロジックでは、WEBアクセスリクエストで変換前のコピーを呼び出し、htmlコードを取得して格納します。静的ファイルの場合。この Web リクエストは、実際には、実際のブラウザが静的コンテンツにアクセスする前に出力される HTML をサーバー自体が表示し、これらのコードを返し、ファイル操作関数を使用して静的ファイルとして保存することに相当します。このようにして、実際のビューアの前にキャッシュ ファイルが作成されます。
このような解決策は元のレイアウトにほとんど影響せず、変更によって 404 などのエラーが発生することはほとんどありません。次に、静的ファイルは、Google などの検索エンジンによってサイトが簡単にインデックスされるのにも役立ちます。なぜだめですか?
最後に、ASP プログラミング環境では、Web アクセスを通じて、多くの人が xmlHTTP コンポーネントを使用してアクセスするため、多くの問題が発生することを思い出してください。 xmlhttp 自体が要求されたリソースをキャッシュするため、このコンポーネントを通じて要求したコンテンツが最新ではなくなり、論理的な混乱が生じます。したがって、Web リクエスト リソースを実装するには、xml Server http オブジェクトまたは winhttp コンポーネントを選択する必要があります。
ASP でキャッシュ テクノロジを使用すると、Web サイトのパフォーマンスが大幅に向上します。実際、これらの実装方法は、サーバー上でのキャッシュの仕組みと、ADO 接続テクノロジと呼ばれる方法の使用方法について説明します。
これらのテクノロジーを紹介する前に、ASP キャッシュ テクノロジーとは一体何なのかを説明しましょう。
いわゆるキャッシュとは、実際にはデータを保存するためにメモリ内にスペースを空けることです。キャッシュを使用することで、ハードディスクに保存したデータに頻繁にアクセスする必要がなくなります。貧弱なハードディスクがいっぱいになるのを見て、データを読み込むのに苦しんでいます。クエリを実行し、クエリ結果をキャッシュに保存すると、繰り返しデータにすばやくアクセスできるようになります。また、データをキャッシュに入れないと、クエリを再度実行するときに、サーバーはデータベースからデータを取得して並べ替えるプロセスに時間を費やします。
データがキャッシュに保存されている場合、再度クエリを実行するときにかかる時間は主にデータの表示にかかります。
言い換えれば、頻繁に変更する必要があるデータをサーバーのキャッシュに置くべきではなく、変更は少ないが頻繁にアクセスする必要があるデータをキャッシュに置く必要があります。
ここでは、ASP がサーバー側でキャッシュ テクノロジをどのように使用するかを説明し、次に ASP がクライアント側でそれをどのように使用するかを説明します。
キャッシング技術。
クライアントに表示する必要がある大量のデータ (静的、つまり変化が少ない) がある場合は、サーバー側のキャッシュ テクノロジの使用を検討できます。このテクノロジーは、表示スタイルの一貫性が高い Web サイトに特に適しています (笑、非主流の Web サイトに使用するのは簡単ではありません)。
実際、実装方法は非常に簡単です。以下の簡単な例を見るだけで理解できます。
本のカテゴリを表示するサンプルプログラムです。
DisplayBooks.ASP ファイル:
< %@ LANGUAGE=JavaScript % >
<html>
<本文>
<フォームメソッド=ポスト>
書籍の分類; < %= getBooksListBox() % >
<p>
<入力タイプ=送信>
<%
関数 getBooksListBox()
{
BooksListBox = アプリケーション(BooksListBox)
if (BooksListBox != null) は BooksListBox を返します。
crlf = String.fromCharCode(13, 10)
BooksListBox = <select name=Books> + crlf;
SQL = Select * FROM Books orDER BY Name;
cnnBooks = Server.CreateObject(ADODB.Connection);
cnnBooks.Open(書籍、管理者、);
rstBooks = cnnBooks.Execute(SQL);
fldBookName = rstBooks(書籍名);
while (!rstBooks.EOF){
BooksListBox = BooksListBox + <オプション> +
fldBookName + + crlf;
rstBooks.MoveNext();
}
書籍リストボックス = 書籍リストボックス +
アプリケーション(書籍リストボックス) = 書籍リストボックス
BooksListBox を返します。
}
%>
実際、これは非常に単純なアプリケーション テクノロジを使用しており、違いは 1 つの文だけです。
アプリケーション(書籍リストボックス) = 書籍リストボックス
これを検証すると、サーバー上のリクエストの数が大幅に減少していることがわかります。この状況は、1 日に 1 回 (または長期間) しか更新しない Web サイトのコンテンツなど、あまり頻繁に更新されない Web サイトのコンテンツに特に適しています。
次に、クライアント側のキャッシュ テクノロジについて説明します。このテクノロジは、切断された ADO 接続テクノロジとも呼ばれます (翻訳レベルが低すぎるため、非常にぎこちなく聞こえます)。この技術は主に、ユーザーのパスワードやコード名などのユーザーの個人情報を保存するために使用されます。主に ADO のいくつかのプロパティを使用します。同時に、一部のネチズンが指摘した、ADO オブジェクトを Applocation で使用できるかどうかという質問にも答えます。説明が明確ではないので、コードで説明してみましょう。
ファイルGLOBAL.ASA:
< !--METADATA TYPE=TypeLib FILE=C:/Program Files/Common
ファイル/システム/ado/msado15.dll-->
< スクリプト言語=VBScript RUNAT=サーバー >
サブアプリケーション_OnStart
SQL = UserInfo から UserName、Password を選択
cnnUsers = DSN=ユーザー
rsUsers = Server.CreateObject(ADODB.Recordset) を設定します。
次の 2 つの文は、利用可能な切断と呼ばれる ADO テクノロジを実装するために使用されていることに注意してください。
rsCustomers.CursorLocation = adUseClient
rsCustomers.Open SQL、cnnAdvWorks、adOpenStatic、AdLockReadOnly
' RecordSet をデータベースから切断します
rsCustomers.ActiveConnection = なし
アプリケーション(rsCustomers) = rsCustomers を設定します。
エンドサブ
ファイルユーザー.ASP
<%
'Clone メソッドを使用すると、各ユーザーが独自の RecordSet コレクションを持つことができます
yourUsers = Application(rsUsers).Clone を設定します。
ユーザー名 = yourUsers(ユーザー名) を設定します。
パスワード = yourUsers(パスワード) に設定します
yourUsers.EOF まで実行します
%>
ユーザー名: < %= UserName % > ユーザーパスワード: < %= Password % >
<%
yourUsers.MoveNext
ループ
%>
キャッシュの役割については、特に、非常に大量の情報や完全なデータベース ページを含む Web サイトの場合、これ以上説明する必要はないと思います。 ASP の実行効率が向上し、サーバーの負荷が軽減されます。たとえば、Dongwang はこの点で最も優れています。たとえば、現在の dvbbs7.1.0 バージョンでは、キャッシュの使用率がより高いレベルに引き上げられています。現在、Dongwang で使用されているのは、 Lost City放蕩息子のキャッシュクラス:
<%
クラスCls_Cache
'==================使用説明書====================
このモジュールは、Dongwang Pioneer、作者: Lost City Prodigal のオリジナル作品です。このタイプのモジュールを使用する場合は、この記述を削除しないでください。このコメントは実行速度には影響しません。
'役割: キャッシュとキャッシュ管理クラス
'パブリック変数: Reloadtime の有効期限 (分)、デフォルト値は 14400
'MaxCount はキャッシュされたオブジェクトの最大値です。これを超えると、使用量の少ないオブジェクトが自動的に削除されます。デフォルト値は 300 です
'CacheName はキャッシュ グループの合計名です。デフォルト値は Dvbbs です。サイトに複数のキャッシュ グループがある場合、この値は外部から変更する必要があります。
'Attribute:Name はキャッシュ オブジェクト名、書き込み専用属性を定義します。
'属性:value キャッシュ データの読み取りおよび書き込み。
'関数: ObjIsEmpty() は、現在のキャッシュの有効期限が切れているかどうかを判断します。
'メソッド: DelCahe(MyCacheName) はキャッシュ オブジェクトを手動で削除します。パラメータはキャッシュ オブジェクトの名前です。
'========================
パブリック リロード時間、最大カウント、キャッシュ名
プライベート LocalCacheName、CacheData、DelCount
プライベートサブクラス_Initialize()
Reloadtime=14400 '有効期限(単位:分)
CacheName=Dvbbs 'キャッシュ グループの合計名
エンドサブ
プライベート サブ SetCache(SetName,NewValue)
アプリケーション.ロック
アプリケーション(セット名) = NewValue
アプリケーション.ロック解除
エンドサブ
Public プロパティ Let Name(ByVal vNewValue) 'キャッシュ オブジェクト名
LocalCacheName=LCase(vNewValue)
終了プロパティ
Public プロパティ Let Value(ByVal vNewValue) 'キャッシュ データの読み取りと書き込み
If LocalCacheName<> then
CacheData=アプリケーション(キャッシュ名&_&ローカルキャッシュ名)
IsArray(CacheData) の場合
キャッシュデータ(0)=vNewValue
キャッシュデータ(1)=今()
それ以外
ReDim キャッシュデータ(2)
キャッシュデータ(0)=vNewValue
キャッシュデータ(1)=今()
終了する場合
SetCache キャッシュ名&_&ローカルキャッシュ名,キャッシュデータ
それ以外
Err.Raise vbObjectError + 1、DvbbsCacheServer、CacheName を変更してください。
終了する場合
終了プロパティ
パブリック プロパティ Get Value()
If LocalCacheName<> then
CacheData=アプリケーション(キャッシュ名&_&ローカルキャッシュ名)
IsArray(CacheData) の場合
値=キャッシュデータ(0)
それ以外
Err.Raise vbObjectError + 1、DvbbsCacheServer、CacheData が空です。
終了する場合
それ以外
Err.Raise vbObjectError + 1、DvbbsCacheServer、CacheName を変更してください。
終了する場合
終了プロパティ
Public Function ObjIsEmpty() '現在のキャッシュの有効期限が切れているかどうかを判断します
ObjIsEmpty=True
CacheData=アプリケーション(キャッシュ名&_&ローカルキャッシュ名)
IsArray(CacheData) でない場合は関数を終了します
IsDate(CacheData(1)) でない場合は関数を終了します
DateDiff(s,CDate(CacheData(1)),Now()) < 60*Reloadtime の場合、ObjIsEmpty=False
終了機能
Private Sub makeEmpty(SetName) 'メモリを解放します
アプリケーション.ロック
アプリケーション(セット名) = 空
アプリケーション.ロック解除
エンドサブ
Public Sub DelCache(MyCacheName) 'キャッシュを削除します
makeEmpty(キャッシュ名&_&Myキャッシュ名)
エンドサブ
終了クラス
'WydCache=New Cls_Cache を設定します
'WydCache.Reloadtime=0.5 '有効期限を定義します(分単位)
'WydCache.CacheName=pages 'キャッシュ名を定義します
'IF WydCache.ObjIsEmpty() then ''使用可能かどうかを判断します (有効期限と空かどうかを含む)
'Response.write WydCache.Value
'それ以外
「…………」
'ボードジャンプリスト=xxx
'WydCache.Value=BoardJumpList 'コンテンツの書き込み
'Response.write BoardJumpList
'次の場合は終了
'
'mycache.DelCache(キャッシュ名) キャッシュを削除します
%>