わかりやすく キャッシュ どうやって 動く
よく読む本を、読むたびに遠い倉庫まで取りに行くとしましょう。行き来するたびに、ずいぶん時間がかかります。でも、その一冊の写しを机の上に置いておけば、次からは手をのばすだけですみます。よく使うデータの写しを近くに置いて、すばやく取り出す方法、これがキャッシュです。
遠い倉庫は行き来が遅い
前のレッスンでは、データを安全に変える方法を見ました。今回は読む側の話です。データベースはふつう、データをディスクに置いていたり、別のコンピューターで動いていたりするので、データを取り出すには、要求を送って答えを待たなければなりません。
この行き来は、思ったより長くかかります。同じデータをもう一度見るときも、最初とまったく同じ遠い道を往復しなければなりません。下で、遠い倉庫に何度か行ってみましょう。
データを押して、遠い倉庫から取り出してみましょう。道が長いので一往復にずいぶんかかり、もう一度押しても同じように遅いです。
一度や二度ならがまんできます。でも、人気の商品の情報のように同じデータを一日に何十万回も探すなら、そのたびに遠い道を往復しなければなりません。待つ時間も積み重なり、倉庫の方も同じ問いに答え続けて、いそがしくなります。
そのうえ、データのほとんどはたまにしか使われず、一部だけがとびぬけてよく使われます。使ったばかりのものをすぐまた使うことも、よくあります。それなら、よく使う一部だけを近くに置けばよいのではないでしょうか。
近くに写しを一部置く
方法は簡単です。よく使うデータを遠い倉庫から一度取り出したあと、近くに写しを一部置いておきます。この近くの置き場所を、キャッシュと呼びます。
キャッシュはふつう倉庫よりずっと速いかわりに、そのぶん小さいものです。メモリーはディスクより速く、同じコンピューターの中は別のコンピューターより近くにあります。そこで、速くて小さい場所に、よく使うものだけを選んで入れます。
項目を押して、近くのキャッシュに写しを置いてみましょう。空っぽだったキャッシュのますが、一つずつうまっていきます。
近くのキャッシュに写しができました。これで、同じデータをまた探すときは、遠い倉庫まで行く必要はありません。すぐ横のキャッシュから取り出せばすみます。
ただし、探しているものがいつもキャッシュにあるとはかぎりません。キャッシュにあるときとないときではすることがちがうので、二つの場合を分けて見ていきましょう。
ヒットとミス
探しているものがキャッシュにすでにあれば、短い道ですぐに取り出します。これをヒットといいます。キャッシュになければ、しかたなく遠い倉庫まで往復しなければなりません。これをミスといいます。
ミスのときは、取ってきたついでに、写しをキャッシュに残しておきます。すると、同じものを次に探すときはヒットになります。すべての要求のうちヒットした割合をヒット率と呼び、キャッシュがどれだけ役に立っているかを見るときは、この値を見ます。
リクエストを押してみましょう。キャッシュにあれば短い道でヒットし、なければ長い道でミスしたあと、写しをキャッシュに残します。同じリクエストを二回押すと、ちがいが分かります。
最初はミスして遅かったのに、写しを残してからは、同じリクエストがヒットして速くなりました。よく探すものほどヒットが増えて、平均の時間が短くなります。
キャッシュがいっぱいになると、新しい写しを置く場所を作るために、何かを追い出さなければなりません。よく使われるのは、いちばん長く使われていないものを追い出すやり方で、この決まりをLRUと呼びます。使ったばかりのものは、すぐまた使われやすいという考えから生まれた決まりです。でも、やっかいな問題が一つ残っています。遠い倉庫の原本が変わったら、キャッシュの写しはどうなるのでしょうか。
キャッシュが古くなるとき
キャッシュは写しにすぎません。遠い倉庫の原本が変わっても、キャッシュはそのことを知らず、前にもらった写しをそのまま持っています。
すると、ヒットは速くても、渡す値が古いことがあります。このような状態を、キャッシュが古くなったといいます。速さとひきかえに、まちがった値を渡すおそれがあること、これがキャッシュの弱点です。
原本を押して、値を変えてみましょう。キャッシュは古い値をそのまま持っていて、キャッシュを入れ直すか捨てると、また原本と合います。
原本を変えたら、キャッシュが食いちがいました。防ぐ方法は大きく二つあります。一つは、原本が変わったときにキャッシュの写しを新しい値に直すか消すこと、もう一つは、写しに有効期限をつけて、時間がたったら捨てることです。
捨てた場所は、次のミスのときに新しい写しでまたうまります。有効期限を短くすると古い値は減りますがミスが増え、長くするとその逆になります。どちらにしても、古い値を減らしながら速いヒットは生かす、バランスを見つける仕事です。
まとめ
まとめるとこうです。遠い保存場所は行き来の道が長くて遅いので、よく使うデータは近くに写しを置きます。それがキャッシュです。探しているものがキャッシュにあればヒットで速く、なければミスで、遠いところまで往復したあと写しを残します。
キャッシュがいっぱいになったら長く使っていないものから追い出し、原本が変わったら写しを直すか捨てて、古い値を防ぎます。近くに置いて速く使いながら、原本と食いちがわないように気をつけること、これがキャッシュです。
要点を順に押して振り返りましょう。(遠いところは遅い → 近くに写し → ヒットとミス → 原本が変わると古くなる)
キャッシュは、データベースの前だけにあるわけではありません。CPUにも、ウェブブラウザーにも、遠くのサーバーの中身を利用者の近くに写しておく配信網にも、同じ考え方が入っています。
速さのためには、近くに置くことと同じくらい、小さくまとめることも大切です。同じ内容をより少ないバイトで保存し、運ぶ方法を、次のレッスン「圧縮」で扱います。