なぜ「キャッシュを消してみて」と言うのか — キャッシュと CDN
画面が変に表示される、変えた内容が見えないと開発者に言うと、高い確率で同じ返事が返ってきます。「一度キャッシュを消してみてください」。あるいは「スーパーリロードしてみてください」。確かに直したはずなのに自分の画面には昔のままのとき、または自分は問題ないのに同僚だけ崩れた画面を見るとき、よく聞く言葉です。
いったいキャッシュとは何で、なぜ消せという言葉がこんなに頻繁に出てくるのでしょうか。この記事では、キャッシュとは何か、そしてその親戚にあたる CDN がどうやってウェブを速くするのかを、コードなしで解きほぐしていきます。
キャッシュは、よく使うものを近くに置くことです #
キャッシュの発想は単純です。よく使うものを毎回遠くから取ってくるのではなく、近くにコピーを置いて、そこから取り出して使おう、ということです。
よく読む本を、図書館まで行かずに机の上に置いておくのと同じです。机の上にある本は手を伸ばせば届くので、毎回図書館を往復する時間を省けます。コンピューターも同じです。一度取ってきたデータを近くに保管しておき、次に同じものが必要になれば、遠くに行かずにそのコピーをすぐ使います。こうすると、同じ仕事をずっと速く処理できます。
この発想は、ウェブのあちこちで使われています。その中で、私たちが最もよく出会うのがブラウザキャッシュです。
ブラウザキャッシュは、自分の端末に残ったコピーです #
ウェブサイトを一つ開くと、文字だけが来るのではありません。画像、画面を飾るデザインファイル、動きを担うファイルまで、いくつものものが一緒に降りてきます。ところが、これらはページを開くたびに大きく変わりません。だからブラウザは、一度受け取ったファイルを自分の端末に保存しておき、次に同じサイトを開くと、新しく受け取らずに保存しておいたコピーを使います。サイトが二度目から速く表示されるのは、このおかげです。
問題はここで起きます。開発者がデザインファイルを新しいものに変えてデプロイしても、自分のブラウザは「これは前に受け取ったものがある」と、昔のコピーをそのまま見せることがあります。だから確かに直したはずなのに、自分の画面だけ昔のままという事態が起きます。このとき「キャッシュを消してみてください」という言葉は、保存しておいた昔のコピーを捨てて、新しく受け取ってこいという意味です。スーパーリロードも同じことをします。保存されたコピーを無視して、サーバーから最新のファイルをもう一度受け取ってきます。
CDN は、世界中にばらまいたコピーの倉庫です #
キャッシュの発想を、もっと大きな規模に移したものが CDN です。日本語ではコンテンツ配信ネットワークと呼びます。
サービスのサーバーが韓国にあるとします。地球の反対側のユーザーがこのサイトを開くと、データが遠い距離を行き来しなければならず、遅くなります。CDN はこの問題をコピーで解きます。画像やデザインファイルのように、よく使うものを世界のあちこちにあらかじめコピーしておき、ユーザーが接続すると、その人に最も近いところから送り出します。
全国にばらまかれたコンビニチェーンに似ています。買い物のために本社の倉庫まで行く必要はなく、家のそばのコンビニで同じ品物を受け取るのです。遠くにある本社を往復する代わりに近くで受け取るので、ずっと速く、本社に客が一度に押し寄せることも減ります。CDN は、ユーザーには速度を、サーバーには負担を軽くしてくれる仕掛けです。
キャッシュは速いけれど、昔のものを見せることがあります #
キャッシュは速度のための道具ですが、その代わりに昔の内容を見せる危険を抱えています。コピーを置いて使う以上、元が変わってもコピーがそのままなら、昔のものが見えるからです。先に見た「直したのに変わらない」問題が、まさにこの代償です。
だから開発者は、新しい内容を確実に見せなければならないとき、いくつかの方法を使います。ファイルを変えるたびに名前を少し変えて、ブラウザが初めて見るファイルだと思って新しく受け取るようにしたり、CDN にばらまかれた昔のコピーを一度に捨てるよう命じたりします。こうして昔のコピーを引き上げることをキャッシュの無効化と呼びます。デプロイした内容がユーザーにすぐ見えないとき、開発チームが「キャッシュのせい」と言う状況がこれです。
なぜ非開発者が知っておくと仕事が楽になるのか #
- 「自分には見えるのに同僚には見えない」が理解できます。 それぞれのブラウザが保存したコピーが違うために起きることです。キャッシュを空にして見直せば、たいてい同じ画面になります。
- デプロイ直後にあわてません。 新しい内容がすぐ見えなくても、必ずしも失敗したデプロイではありません。キャッシュが昔のコピーをしばらく見せている最中かもしれません。
- 確認はキャッシュを空にして行います。 新しく変わった画面を点検するときは、キャッシュを消すかスーパーリロードで最新の状態を見てから判断すれば、昔のコピーにだまされることを減らせます。
まとめ #
キャッシュは、よく使うものを近くに置いて速度を上げる発想で、CDN は、そのコピーを世界中にばらまいて、誰にでも速く届ける仕掛けです。どちらもウェブを速くする頼もしい道具ですが、コピーを使う分だけ、昔の内容を見せることがあるという代償も一緒に抱えています。「キャッシュを消してみて」という言葉が、なぜそんなに頻繁に出てくるのか、もうつかめたはずです。
サーバーとデプロイがどう行われるのかをもっと知りたければサーバー、クラウド、そしてデプロイを、そのサーバーを借りて使うクラウドが気になればクラウドとは結局、他人のコンピューターを借りることを一緒に読んでみることをおすすめします。