cache
素晴らしいblog
Stale-While-Revalidate ヘッダによるブラウザキャッシュの非同期更新(これが基本 からわかりやすい)
システムにおいてキャッシュの設計は、永遠の課題でありWebのパフォーマンスにおいても非常に重要。
WebはHTTPヘッダーを用いてブラウザやプロキシにキャッシュの制御を指定する。
Stale-While-Revalidateヘッダーは、このキャッシュ制御に選択肢を追加する新しい仕様。
Cache設計の難しいところ
キャッシュは、「再利用」を行う目的でありながら、ある一定の範囲で「更新」を行いたいという、相反するコントロールが求められる。(キャッシュ設計のもっとも難しい点はここ)
キャッシュに関わるヘッダーや機能は他にもある点、そしてブラウザは独自の判断でキャッシュを使う場合があることに注意する。
Cache保存単位
ブラウザのキャッシュは基本的にURL単位で行われるため、URLが変わればキャッシュが変わる。
そのためこういうのをよくしていた
<script src="production.min.js?ver=1"></script>
↓
<!-- ver2に変える -->
<script src="production.min.js?ver=2"></script>
注意点がある。
ただし、この <script>
を含む index.html
自体が長期間キャッシュされてしまうと、 production.min.jsのURLも更新できない。
したがって、 index.html自体は長期間のキャッシュがしにくいという問題は残る。
Webにおけるキャッシュを指定するところ
Webでは、HTTPヘッダーを用いて
- ブラウザ
- プロキシ
にキャッシュの制御を指定する
キャッシュ制御が重要な理由
キャッシュを行う意義は大きく2つある。
- リソースの取得を高速化する
- サーバへの負荷を減らす
ブラウザーキャッシングは、リソースを保存してインターネット上のユーザー体験を向上させる優れた方法ですが、キャッシュを制御しないと、非常に脆化する恐れがある。
すべてのサイトのすべてのリソースは、同じキャッシュルールに制約されています。
つまり、機密情報は公開情報と同じ方法でキャッシュされ、頻繁に更新されるリソースは、めったに変更されないリソースと同じ期間だけキャッシュされます。
Webにおけるキャッシュ
歴史としてはHTTPヘッダーを用いてキャッシュを管理させる方法を用いてきた。
Webにおけるキャッシュの指定には大きく2つの方式がある。
-
ブラウザはリクエストを発行せず、保持するキャッシュを使用する
Cache-Control, Expires
-
ブラウザはリクエストを発行しサーバにキャッシュの有効性を確認してから、キャッシュを使用する
ETag, Last-Modified
Etag, Last-Modified
HTTPには、Conditional GET(条件付きGET)という仕組みがある。 これは、「すでに保持しているキャッシュが今でも有効かどうか」をサーバに問い合わせる方法。
具体的には、サーバは ETag, Last-Modified
などのヘッダーをレスポンスに付与することで、リソースに関する情報をクライアントに伝え、クライアントはその情報を次のコンテントネゴシエーションに利用し、キャッシュの再利用可否などを判断する。
Etag
そのリソースを一意に特定する値、要するにリソースのハッシュ値
Last-Modified
そのリソースが最後に更新されたタイムスタンプ。この値を保存したブラウザは、同じURLへのリクエストに、キャッシュしたリソースに付与されていた値を設定してサーバに問い合わせる。 サーバは、リクエストされたリソースについて各値を検証する。
cacheの種類
静的サイトだけでなくWebサイトに対するキャッシュとしては、大きく分けて下記の二種類のキャッシュがある。
-
サーバサイド CDNキャッシュ データベースキャッシュ ※注意点 CDNのキャッシュは管理者(サイト運営者)側で削除できる。
-
クライアントサイド cookie ブラウザのローカルキャッシュ ※注意点 CDNのキャッシュは管理者(サイト運営者)側で削除できるが、ブラウザのローカルキャッシュは削除できない。 ブラウザのローカルキャッシュはサイトを閲覧しているユーザの端末に保存されるキャッシュなので、ブラウザのスーパーリロードを実施してもらったり、その他の方法でキャッシュを削除してもらうようユーザに依頼する必要があります。
ブラウザローカルキャッシュさせない
ブラウザのローカルキャッシュを保存させないようにするためには、レスポンスヘッダーに Cache-Control
でキャッシュの動作を指定する必要がある。
cacheするコンテンツ・データの種類
キャッシュするコンテンツ・データにも下記のような種類がある。
- html
- css, js
- 画像データ それぞれキャッシュが残っていることで古い情報が表示され続けていたり、表示が崩れていたり、ボタンなどの動作が正しくなかったりといったことが起こる。 場合によってはコンテンツ・データの種類によってキャッシュ戦略を変える必要も出てきます。
Cache-Controlとは
Cache-Controlは、ブラウザーのキャッシュ動作を管理するHTTPヘッダーのこと。 簡単に言えば、誰かがWebサイトを訪問するとブラウザーはキャッシュと呼ばれるストアに画像やWebサイトデータといった特定のリソースを保存します。 そのユーザーが同じWebサイトを再度訪問すると、Cache-Controlは、そのユーザーにローカルキャッシュからリソースを読み込ませるか、またはブラウザーがサーバーに新しいリソースを要求する必要があるかを決めるルールを設定します。Cache-Controlをより深く 理解するには、ブラウザキャッシュおよびHTTPヘッダーの基本を理解する必要があります。
cache-control: max-age このディレクティブは、ダウンロード後にキャッシュからリソースを提供できる秒数、つまり寿命を指示する。 たとえば、最大寿命が1800に設定されている場合、リソースをサーバーへ最初に要求してから1,800秒(30分)
ブラウザーキャッシュ
ブラウザーキャッシュは、WebブラウザーがWebサイトのリソースを保存することでサーバーから再度取得しなくても済むようにするもの。 たとえば、Webサイトの背景画像はキャッシュとしてローカル保存されるため、ユーザーがそのページを再度訪問したときに、画像はユーザーのローカルファイルから読み込まれるのでページ読み込み速度はずっと速くなる。
そうしたリソースをブラウザーはTime To Live(TTL)と呼ばれる一定期間だけ保存します。 ユーザーがTTLの期限が切れた後でキャッシュされたリソースを要求した場合、ブラウザーはサーバーに再度アクセスしてリソースの新しいコピーをダウンロードしなければならない。 ブラウザーとWebサーバーは、各リソースのTTLをどのように見分けるのでしょうか?ここで登場するのがHTTPヘッダーです。
cacheの重要性
Webサービスの応答速度を向上させることにより、ユーザー体験向上につながる。 実際に40%以上のWebサービスのユーザーはページの読み込みを3秒以上待てないという調査結果がある。
クラウドコンピューティングを利用し、Webサービスを提供する場合の読み込み遅延の要因は次の3つ。
- クラウドのデータセンター内での処理遅延
- エンドユーザーとデータセンター間のネットワーク転送遅延
- ブラウザ上でのコンテンツ表示遅延
過去のcache
Webサービスを提供する企業は、Akamai・CloudFrontなどの事業者が提供するCDN(Content Delivery Network)を以前より活用し、画像や動画などの静的コンテンツの配信を高速化してきた。
最近のcache
近年では、一度キャッシュされたデータを破棄するまでの処理時間が高速化したことにより動的コンテンツのキャッシュにもCDNを利用することがある。 さらには、単なるキャッシュを配信するだけでなく、CDNのエッジサーバ上で要求に対して任意の処理を実行できるように、エッジサーバに任意のアプリケーションを配置することが可能となるCDN Edge Workerと呼ばれるサービス