Q: 良いキャッシュとはどのようなキャッシュですか?
問題を解決するキャッシュは、優れたキャッシュです。この文はただのナンセンスで、白猫、黒猫、ネズミを捕まえるのが良い猫に相当します。
では、問題を解決する前提として、どのキャッシュが最適なのでしょうか? この質問に対する私の答えは、「キャッシュ ヒット率が高いキャッシュは優れたキャッシュである」です。
問題を解決するという前提の下では、ヒット率の高いキャッシュは、ヒット率の低いキャッシュよりも必要なハードウェア投資が少なくて済むと同時に、ヒット率の低いキャッシュの数よりもキャッシュの数が少なくて済みます。このようにして、アドレス指定速度は確実に速くなります。したがって、ヒット率が高いキャッシュは優れたキャッシュです。
キャッシュヒット率
キャッシュされたエンティティがキャッシュにスローされた後、エンティティがキャッシュされている間 (キャッシュされているエンティティのライフ サイクル中) に外部から一度も使用されなかった場合、キャッシュされたエンティティのヒット率は 0 になります。このエンティティがリクエストされる回数が増えるほど、そのキャッシュ ヒット率は高くなります。
上で述べたのは、キャッシュ内のエンティティのヒット率です。キャッシュ全体のヒット率は、上記のキャッシュされた個々のヒット率分布図となります。
キャッシュの場合: 通常、最もよく使用される個人は全体のごく一部です。最も使用頻度の低いものが全体の大部分を占めます。
したがって、次のようなデータがよく見られます。
キャッシュされた 10,000 個の要素のうち、100 個はほぼ毎分頻繁に使用されます。 2000 個のデータが 1 時間に 1 回リクエストされます。 1 日 1 回 3000 件のデータが要求され、残りのデータはキャッシュに放り込まれた後、一度も使用されていません。
今はハードウェアが急速に発達しているので、10,000 個のデータをキャッシュするだけで十分であれば、データを探す限り、10,000 個のデータをすべてキャッシュに放り込むことができます。キャッシュ内のデータ。追加の操作を実行したり、データベースにリクエストを行ったりする必要はありません。
ただし、ハードウェアは急速に発展し、データ量も増加します。小規模な Web サイトの場合、10,000 個のデータがキャッシュされると、すべてがキャッシュされることになります。ただし、大規模な Web サイトには少なくとも数百万のデータまたは T レベルのデータがあり、これらのデータをすべてキャッシュに入れることはできません。現時点では、合理的なキャッシュ ソリューションを設計し、キャッシュ ヒット率を向上させることが非常に重要です。そしてそれは必要なことなのです。
キャッシュヒット率を向上させるための一般的な方法
純粋に技術的な観点から見ると、単位時間あたりのユーザー リクエストの数のみを記録し、この情報に基づいて最もよく使用されるデータをキャッシュします。
しかし、多くの場合、ビジネス ロジックに基づいてキャッシュ ヒット率が向上します。例: 昨年と一昨年に公開されたブログでは、この種の記事の閲覧リクエストは通常、少なくとも 1 日に数回ありました。通常、メモリにキャッシュすべきではありません。
別の例として、一般に、返信が多い投稿は、返信が少ない投稿よりも多くの人に閲覧されます。
キャッシュ ヒット率を向上するには、上記のロジックを使用し、実際のビジネス ロジックに基づいたキャッシュ アルゴリズムを提供する必要があります。ハードウェアが許可するすべてのデータではなく、適切なデータをキャッシュしましょう。
否定的な例は次のとおりです。大規模なブログ サイトでは、ユーザーが記事をリクエストすると、その記事がメモリ キャッシュにないことが判明したため、データベースから読み取られてキャッシュに放り込まれます。
ご存知のとおり、今ではクローラーがたくさんあります。さらに、ブログなどの検索エンジンに優しいサイトの場合、アクセス圧力のほとんどは検索エンジンから来ます。これらの訪問は通常 1 時間または 1 日で、特定の記事に対するリクエストが数回または 1 回だけで、その後は二度と行われません。上記のキャッシュ方法のヒット率は非常に低くなります。
Guo Honjun さん、あなたは私にこれらのブログのコンテンツをキャッシュするよう勧めていないのですが、少なくとも私のブログ サイトの応答が遅くならないようにするには、どうすればサイトのパフォーマンスを改善できるでしょうか?ユーザーのリクエストに。
この問題には多くの解決策があります。最も簡単な方法の 1 つは、これらのブログをファイル システムのキャッシュである静的 HTML ページにすることです。ファイル システムは単純に無限に拡張可能であると考えられます。そのため、ヒット率の低い多くのコンテンツがキャッシュされます。
ページに動的なロジック判断が必要な場合は、データを XML ファイルにキャッシュし、サーバー セグメントがこれらの XML ファイルを統合するか、ファイルをインクルードします。これも良いアプローチです。
キャッシュ ヒット率について多くの問題を述べてきましたが、キャッシュ ヒット率に関する見解を簡単にまとめてみましょう。
小規模な Web サイトではすべてのデータをキャッシュでき、通常は大きな負荷がかからないため、キャッシュ ヒット率の問題は無視できます。
大規模なサービスでは、すべてのデータをキャッシュすることはできませんが、現時点では、キャッシュ ヒット率を可能な限り向上させるために、アーキテクトはビジネス ロジックに適したキャッシュ方法を設計する必要があります。
ヒット率を向上させる方法のほとんどはビジネス ロジックに関連付けられており、メモリにキャッシュできないデータの場合、パフォーマンスを向上させる最も簡単な方法はファイル キャッシュを使用することです。
ファイル キャッシュでは、コンテンツ全体を静的ファイルにキャッシュできます。また、ページ全体の領域をファイルにキャッシュしてから、エンティティを XML ファイルにシリアル化してキャッシュすることもできます。
キャッシュに関するその他のそれほど重要ではない側面をいくつか見てみましょう。
キャッシュライフサイクルアクティビティ
有効期限が切れないコンテンツや永久に変更されるコンテンツは、キャッシュに配置しないでください。キャッシュは一時的なストレージであり、永続的なものではないため、キャッシュのライフサイクルは制限されています。
次に、次のアクティビティを実行する可能性があります。
キャッシュを入力します。 (キャッシュに入るとき、将来の有効期限ポリシーを指定する必要がある場合があります。指定しない場合は、システムのデフォルトの有効期限ポリシーを使用する必要があります)
キャッシュから取得します。現時点ではスレッドの安全性の問題に対処する必要があることに注意してください。
キャッシュを更新するときは、キャッシュを離れるときのスレッドの安全性の問題も考慮する必要があることに注意してください。これは外部リクエストである場合もあれば、キャッシュが有効期限ポリシーに基づいてクリアする場合もあります。
キャッシュ有効期限ポリシー
一般的には、これまでに扱ったキャッシュでどのようなキャッシュ有効期限戦略に遭遇したことがありますか?と尋ねます。
最も一般的な有効期限戦略は次のとおりです。
長期間リクエストされなかった場合、期限切れになります。最も一般的なのは、ASP および ASP.net が提供するセクション機能です。実際、それはキャッシュです。
ファイルの変更に依存するキャッシュは、ファイル (通常は WEB サイトの Web.config) が変更されると期限切れになります。ファイルが変更されると、キャッシュが再起動されるだけでなく、IIS プロセスもリリースされます。
これに基づいて、多くの依存関係に対するキャッシュ有効期限ポリシーが表示される場合があります。たとえば、データベースに依存するキャッシュ有効期限ポリシーなどです。
もちろん、ビジネス ロジックにはより複雑な有効期限戦略がある可能性があります。新しいバージョンの CSDN ポイント システム フォーラムでは、リスト データ キャッシュが 600 に達すると、投稿リスト キャッシュが 550 個のデータにクリアされます。
別の例としては、新しいポイントベースのフォーラム投稿のキャッシュは、その投稿を参照するリストが存在しない場合に期限切れとなり、投稿が期限切れになる場合があります。
キャッシュ同期の問題
キャッシュを使用するということは、同じデータの複数のコピーが共存できることを意味します。コードで特定の状況が考慮されていない場合、2 つのデータは矛盾します。このときに問題が発生します。
解決策は簡単です。ビジネス ロジックとコードをトリガーする状況を注意深く検討し、底に達していない領域を残さないようにします。
単純な方法では、コード ロジックが非常に複雑になる場合があります。
このため、必要がない場合はキャッシュを使用しないことを推奨する人もいます。キャッシュの使用を開始したら、データ同期を処理するために多くのコードを追加する準備をする必要があります。
キャッシュデータを初期化して埋める
キャッシュの初期化後、一部のデータをキャッシュに事前に取り込む必要がある場合があります。これはキャッシュされたデータの初期化操作です。
キャッシュされたデータの初期化操作中には、次の問題を考慮する必要があります。
初期化にはどれくらいの時間がかかりますか? 通常、サイトの場合、この初期化作業は Global.asa の Application_OnStart で処理できます。通常、初期化にそれほど時間がかかることはありません。この時点で、コードの最適化能力がテストされます。
初期化中、通常の使用では一度に 1 つのデータを処理するのではなく、データはバッチでインポートされます。
要約:
この記事では、特定のキャッシュ テクノロジについては詳しく説明せずに、キャッシュに関する私の見解をいくつか紹介します。この記事の説明を通じて、キャッシングの使い方だけは知っているが、キャッシングの概念が理解できない人に予備的な理解をしてもらえれば幸いです。
http://blog.csdn.net/ghj1976/archive/2007/09/01/1768676.aspx