キャッシュされたデータとは何ですか?キャッシュのクリアとは何を意味し、それは何をしますか?

まず、キャッシュとは何ですか?

一般的に、キャッシュ(「キャッシュ」と発音)はリポジトリの一種です。リポジトリはストレージデポと考えることができます。軍隊では、これは任務を遂行するために必要な武器、食料、その他の物資を保持することです。

コンピュータサイエンスでは、これらの「サプライ」はリソースと呼ばれ、リソースはスクリプト、コード、およびドキュメントコンテンツです。後者は、テキスト、静的データ、メディア、ハイパーリンクなど、より具体的に「アセット」と呼ばれることもありますが、ここでは、リソースという1つの用語のみを使用します。

キャッシュと他のタイプのリポジトリの違い

キャッシュの主な目的は、Webページのリソースの取得を高速化し、ページの読み込み時間を短縮することです。キャッシュのもう1つの重要な側面は、比較的新しいデータが含まれていることを確認することです。

この記事では、ブラウザのキャッシュコンテンツ配信ネットワーク(CDN)の2つの一般的なキャッシュ方法について説明します。

キャッシュに加えて、他のリポジトリがWebアーキテクチャで機能します。多くの場合、これらは膨大な量のデータを保持するように設計されています。ただし、検索パフォーマンスにはそれほど重点が置かれていません。

たとえば、Amazon Glacierは、データを安価に保存するように設計されたデータリポジトリですが、データをすばやく取得することはできません。一方、SQLデータベースは、柔軟性があり、最新で、高速であるように設計されていますが、安価になることはめったになく、通常はキャッシュほど高速ではありません。

ブラウザキャッシュ:メモリキャッシュ

メモリキャッシュは、ブラウザが実行されているコンピュータにローカルにリソースを格納します。ブラウザがアクティブな間、取得されたリソースはコンピュータの物理メモリ(RAM)に保存され、場合によってはハードドライブにも保存されます。

後で、Webページに再度アクセスするときにまったく同じリソースが必要になると、ブラウザーはリモートサーバーではなくキャッシュからそれらをプルします。キャッシュはローカルに保存されるため、高速メモリに保存されるため、これらのリソースのフェッチが速くなり、ページの読み込みが速くなります。

リソース検索の速度が重要ですが、リソースが新鮮である必要もあります。古いリソースとは、古くなっており、無効になっている可能性のあるリソースです。

ブラウザの仕事の一部は、キャッシュされたリソースが古くなっているかどうかを識別し、古くなっているリソースを再フェッチすることです。Webページには通常、リソースが含まれている可能性があるため、通常、キャッシュには古いバージョンと新しいバージョンが混在しています。

ブラウザは、キャッシュ内の古いものをどのように認識しますか?

答えは簡単ではありませんが、キャッシュバスティングとHTTPヘッダーフィールドの2つの主要なアプローチがあります。

キャッシュバスティング

イタリア人

キャッシュバスティングは、ブラウザが新しいリソースのみをフェッチすることを保証するサーバーサイドの手法です。これは間接的に行われます。

キャッシュバスティングは劇的に聞こえるかもしれませんが、実際には何もバストせず、ブラウザにすでにキャッシュされているものにも触れません。キャッシュバスティングが行うのは、元のリソースのURIを変更して、リソースが完全に新しいようにブラウザに表示されるようにすることだけです。見た目が新しいため、ブラウザのキャッシュにはありません。キャッシュされたリソースの古いバージョンは引き続きキャッシュされますが、最終的には枯れて死んでしまい、二度とアクセスされることはありません。

www.foobar.com/about.htmlあなたが知りたいと思うfoobar.comについてのすべてを述べているウェブページがそこにあるとしましょう。そのページにアクセスすると、そのページとそれに関連付けられているリソースがブラウザによってキャッシュされます。

その後、foobar.comはQuxbaz社に買収され、aboutページのコンテンツは大幅に変更されました。ブラウザのキャッシュにはその新しいコンテンツは含まれていませんが、ブラウザのキャッシュには最新のコンテンツがあると信じられており、再フェッチを試みることはありません。

Quxbaz Web管理者は、すべての新しいコンテンツを確実にプッシュするために何をしますか?

ブラウザはキャッシュ内のアイテムを見つけるためにURIに依存しているため、リソースのURIが変更された場合、ブラウザはサーバーからそのリソースをフェッチする前にそれを見たことがないようです。

したがって、リソースURIをwww.foobar.com/about.htmlからwww.foobar.com/about2.html(またはにwww.quxbaz.com/about.html)に変更することにより、ブラウザーはそのURIに関連付けられたキャッシュリソースを検出せず、サーバーからフルフェッチを実行します。リソースは古いURIの元のリソースと実質的に同じである可能性がありますが、ブラウザはそれを認識していません。

ただし、ページ名を変更する必要はありません。URIには定義上クエリ文字列も含まれているため、バージョンパラメータをURIに追加できますwww.foobar.com/about.html?v=2hef9eb1

この場合、バージョンパラメータvは、コンテンツが変更されるたびに、またはサーバーの再起動などの他のプロセスによってトリガーされるたびに、新しく生成されたハッシュ値に新しく設定されます。ブラウザは、クエリ文字列が変更されたことを確認します。クエリ文字列は返される内容に影響を与える可能性があるため、サーバーから最新のリソースをフェッチします。

古いURIがブックマークから直接アクセスされる場合、これらの手法はどちらも機能しません。ブラウザが最後にキャッシュされたリクエストでURIを再検証するように指示されない限り(またはキャッシュされたリソースが期限切れになった場合)、ブラウザはキャッシュを更新するためにフルフェッチを実行しません。これにより、次のトピックに進みます。

HTTPヘッダーフィールド

すべてのリソースリクエストには、ヘッダーと呼ばれるメタ情報が付属しています。逆に、すべての応答にはヘッダー情報も関連付けられています。

場合によっては、ブラウザは応答ヘッダー値を確認し、後続の要求ヘッダーの対応する値を変更します。これらのヘッダー値の中には、ブラウザーでのリソースキャッシュの実行方法に影響を与える値があります。

HEADリクエストと条件付きリクエスト

HEADリクエストは、切り捨てられたGETまたはPOSTリクエストのようなものです。完全なリソースを要求する代わりに、HEAD要求は、完全な要求で返されるヘッダーフィールドのみを要求します。

リソースのヘッダーは、通常、それに関連付けられているリソースデータ(応答の「本体」)よりもはるかに小さくなります(合計バイト数)。ヘッダー情報は、ブラウザーがキャッシュ内のリソースの鮮度を判別できるようにするために十分な情報を提供します。

HEADリクエストは、サーバーリソースの有効性を確認するためによく使用されます(つまり、リソースはまだ存在し、存在する場合は、ブラウザーが最後にアクセスしてから更新されていますか?)。ブラウザは、HEADリクエストがリソースが有効であることを示している場合、キャッシュにあるものを使用します。それ以外の場合、ブラウザは完全なGETまたはPOSTリクエストを実行し、返されたものでキャッシュを更新します。

条件付きリクエストを使用すると、ブラウザは、キャッシュされたリソースの鮮度を説明するフィールドをヘッダーに送信します。今回、サーバーはブラウザのキャッシュがまだ新しいかどうかを判断します。

そうである場合、サーバーは、リソースのヘッダー情報のみを含み、リソース本体(データ)を含まない304応答を返します。ブラウザのキャッシュが古くなっていると判断された場合、サーバーは完全な200OK応答を返します。

このメカニズムは、1つではなく2つの要求を発行する必要がないため、HEAD要求を使用するよりも高速です。

上記は、かなり複雑なプロセスになる可能性があるものを単純化したものです。キャッシュには多くの微調整が含まれますが、すべてはヘッダーフィールドを介して制御され、その中で最も重要なのはキャッシュ制御です。

キャッシュ制御

リクエストに応答すると、サーバーはヘッダーフィールドをブラウザに送信し、キャッシュ時にどのような動作を採用する必要があるかを示します。でページをロードする//en.wikipedia.org/wiki/Uniform_Resource_Identifierと、応答のヘッダーレコードに次の情報が含まれます。

cache-control: private, s-maxage=0, max-age=0, must-revalidate 

プライベートとは、ブラウザのみがドキュメントのコンテンツをキャッシュする必要があることを意味します。

s-maxagemax-age0に設定されますS-MAXAGE一方値は、キャッシュとプロキシサーバー用であるMAXAGEは、ブラウザを対象としています。max-ageのみを設定すると、キャッシュされたリソースはすぐに期限切れになりますが、同じブラウザセッションでのページの再読み込み中に(古くなっていても)引き続き使用される可能性があります。

失効したリソースは、HEAD要求による再検証である可能性があり、応答に応じて、GETまたはPOST要求が続く場合があります。必携再検証ディレクティブは、それが古くなっている場合は、キャッシュされたリソースを再検証するために、ブラウザに指示します。

以来最大エージングがに設定されている0この場合には、キャッシュされたリソースがすぐに陳腐一度受けています。2つのディレクティブの組み合わせは、単一のディレクティブno-cacheと同等です。

2つの設定により、同じセッションにあるかどうかに関係なく、ブラウザは常にキャッシュされたリソースを再検証します。

キャッシュ制御ディレクティブは非常に広範であり、時には混乱を招きます–それ自体がトピックです。ディレクティブの完全な文書化されたリストは、ここにあります。

Eタグ

これはサーバーが送信するトークンであり、ブラウザーは次の要求まで保持します。これは、リソースのキャッシュの有効期限が切れたことをブラウザが認識している場合にのみ使用されます。

Eタグはサーバーで生成されたハッシュ値であり、多くの場合、リソースの物理ファイル名とサーバー上の最終変更日をシードとして使用します。リソースファイルが更新されると、変更された日付が変更され、新しいハッシュ値が生成され、応答ヘッダーでリクエストに送信されます。

キャッシュに影響を与えるその他のヘッダータグ

ヘッダータグの有効期限が切れ最終変更はほとんど廃止されていますが、古いブラウザとの下位互換性のために、ほとんどのサーバーから送信されています。例:

expires: Thu, 01 Jan 1970 00:00:00 GMT last-modified: Sun, 01 Mar 2020 17:59:02 GMT 

ここでは、有効期限は0番目の日付に設定されています(歴史的には、UNIXオペレーティングシステムから)。これは、max-age = 0と同様に、リソースがすぐに期限切れになることを示しています。Last-modifiedは、リソースに最新の更新がいつ行われたかをブラウザーに通知します。これを使用して、キャッシュ値を使用するのではなく、リソースを再フェッチする必要があるかどうかを判断できます。

ブラウザからキャッシュを強制的に更新する

ハードリロードとは何ですか?

ハードリロードは、コンテンツ、スクリプト、スタイルシート、メディアのいずれであっても、ページ上のすべてのリソースを強制的に再フェッチします。ほとんどすべてですよね?

一部のリソースは、ページに明示的に含まれていない場合があります。代わりに、通常はすべての明示的なものがロードされた後に、動的にフェッチできます。

ブラウザは、これが発生することを事前に認識していません。発生した場合、後の要求(通常はスクリプトによって開始されます)は、利用可能な場合、それらのリソースのキャッシュされたコピーを引き続き使用します。

クリアキャッシュとハードリロードとは何ですか?

この操作はブラウザのキャッシュ全体をクリアします。これはハードリロードと同じ効果がありますが、さらに動的にロードされたリソースもフェッチされます。結局のところ、キャッシュには何もないので、選択の余地はありません。

コンテンツ配信ネットワーク:地理的に配置されたキャッシュ

CDNは単なるキャッシュではありませんが、キャッシュはその仕事の1つです。CDNは地理的に分散した場所にデータを保存するため、地理的にローカルなブラウザとの往復時間が短縮されます。

ブラウザのリクエストは近くのCDNにルーティングされるため、応答データが移動する必要のある物理的な距離が短くなります。CDNは、大量のトラフィックを処理し、特定の種類の攻撃に対するセキュリティを提供することもできます。

CDNは、インターネットのバックボーンの一部であるノードであるインターネットエクスチェンジポイント(IXP)を介してリソースを取得します(大文字で)。ホストサーバーではなくCDNに移動するようにリクエストルーティングを設定するための手順があります。次のステップは、CDNにWebサイトの現在のコンテンツがあることを確認することです。

昔は、ほとんどのCDNがプッシュ方式をサポートしていました。Webサイトは新しいコンテンツをCDNハブにプッシュし、CDNハブは地理的に分散したノードに配信されていました。

現在、ほとんどのCDNは、上記の(または同様の)キャッシュプロトコルを使用して、1)新しいリソースをダウンロードし、2)既存のリソースを更新します。ブラウザにはまだキャッシュがあり、そのいずれも変更されません。CDNが行うのは、新しいリソースの転送を高速化することだけです。