一言でCache(キャッシュ)と言っても、人によって思い浮かべることはさまざまでしょう。今日はキャッシュとはなにか、なんのためにあるのかをご紹介し、システム開発にどうキャッシュを活かせばよいか、考えるヒントをご提供します。
- 連載「売り上げ向上の即効薬『電光石火のウェブサイト』」のほかの記事はこちら
第1回:イントロダクション - 第2回:Solrパワーの活用
- 第3回:この記事
- 第4回:ダイナミックページアッセンブリーの威力がすごい
- 第5回:Solrをインストールしてみよう
Ⅰ.データの隠し場所cache(キャッシュ)
cacheという単語は「隠し場所」というような意味で、フランス語のcaché(隠された)が語源と言われています。Caché(キャシエ)という高速が売りのデータベース管理ソフトがありますが、その高速さはデータを極力メモリ上に置こうとすることで実現するので、だからCachéというネーミングにしたのかもしれません。本編が始まる前に脱線してしまいました。cacheに話を戻して、今回はシステムを高速化するためのcacheについてその概要を紹介したいと思います。
キャッシュとは一体どのようなところで使われているのでしょうか。
CPUキャッシュ、GPUキャッシュ、Diskキャッシュ、Webキャッシュ、ブラウザキャッシュ、アプリケーションキャッシュ、データベースキャッシュなどハードウェアやソフトウェアのいたるところでキャッシュは使われています。
コンピューターの部品でもっともスピードを気にする部分と言えばCPUですよね。例えばintel Core i7には、1cm~2cm四方のチップ上になんと70~140億個ものトランジスタが入っているわけですが、演算に使用されているのはごくわずかで、ほとんどがキャッシュメモリーとして使用されています。この世の中でもっとも高い家賃のマンションと例えられるICチップの大きな面積を専有するのがキャッシュメモリーということからも、いかにスピードアップにはキャッシュが有効なのかイメージしていただけるのではないでしょうか。
Ⅱ.ウェブ開発におけるキャッシュ利用の重点項目は?
いろいろなシーンで活躍しているキャッシュですが、今回はウェブ開発ということにフォーカスしてご紹介します。
さて一般的なウェブ開発ではどの部分でスピードの差が生じるのでしょう?ファイルを読み書きするときのディスクアクセス、データベースを読みに行くときは、データベースファイルシステムをクエリします。またユーザーとしてウェブサイトを閲覧するときのウェブデータファイルへのアクセスなど、さまざまなポイントが考えられます。その中でもそれ自体がボトルネックになり得るRDBMS(リレーショナルデータベースマネ-ジメントシステム)でスピードの差が生じることが多いのです。
MySQLなど古くからあるRDBMSはもちろん、 SQLserverやOracleなどのエンタープライズデータベースシステムにおいても10億単位のオンラインユーザーを抱えるとなるとシステム的に危ういものになってしまいます。
※2016.02.01 編集部注
一部記事内容に関してご指摘をいただきましたため、修正いたしました。
もうひとつ、データベースにはTPS(トランザクション/秒)においてボトルネックが存在します。多くの同時アクセスが発生する大規模ウェブシステムではTPSを考慮しなくてはなりません。1日あたりのPV(ページビュー)が1000万クラスのウェブサイトではデータベースへの同時読み書きが頻繁に起こり、もし十分なキャッシュシステムがない場合、ピーク時には大惨事に見舞われることになります。
Ⅲ.優先して利用したい4種類のキャッシュ
さて、実際の開発において私たちは、ウェブサイトの高速化のために、現在は次の4種のキャッシュを優先して利用するようにしています。
- 1.ローカルキャッシュ
- 2.分散キャッシュ
- 3.クライアントサイドキャッシュ
- 4.データベースキャッシュ
それではひとつひとつ概要をご紹介していきます。
1.ローカルキャッシュは、サーバーマシンのハードディスクやメモリを利用するキャッシュで、もっとも一般的で手軽に高速化できる手段です。唯一の欠点としては、ロードバランサーにて分散化された環境では使えない(使おうと思えば使えますが、同期をとるのに苦労するので実用的とは言えません)ということがあります。
2.分散キャッシュは、分散化サーバーにおける利用を考慮されたキャッシュシステムです。よく知られたものとして「Memcached」「Redis」といったキャッシュメモリシステムがあります。通常のRDBとは大変な性能差があり、サンプルコードによるテストでは、メモリーエンジンを使ったMySQLよりも2倍以上高速化したという結果が出ています。
3.クライアントサイドキャッシュも、パフォーマンスを上げるのには欠かせませんね。クライアントキャッシュすなわちブラウザキャッシュは、サンドボックスなどブラウザのセキュリティにより制限はありますが、複数のキャッシュシステムを組み合わせて効果を上げます。
- Cookie:ユーザーデータを保管しておくという意味でキャシュの1つと言えます。
- ブラウザローカルキャッシュ:コンテンツを更新したのにお客さまから「直ってない!」というのはこのブラウザローカルキャッシュが原因のことが多いですね。
- Flashローカルキャッシュ:Flashプレーヤーもそれ自体でローカルファイルシステムにデータをキャシュします。
- HTML5アプリケーションキャッシュ: HTML・CSS・JavaScript・イメージなどウェブアプリケーションの利用に必要となるファイルをクライアント環境にキャッシュして、 次回からはオフラインでもウェブアプリケーションを利用できるようにするというものです。HTML5が標準化しつつある今、積極的に利用できるようになりました。
4.データベースキャッシュでは、クエリのキーと結果をセットにしてキャッシュします。頻度の高いクエリからキャッシュするようにします。キャッシュサイズが大きくなるのには気をつけねばなりませんが、うまく使えば劇的なスピードアップが実現できます。
Ⅳ.キャッシュ利用計画のために
キャッシュ利用計画と言うと消費者金融の広告のようですが、冗談はさておき、今回はウェブ高速化のためのキャッシュの利用の導入として書かせていただきました。キャッシュは突き詰めていくと、もっとも深く、もっとも悩ましいテーマでもあります。キャッシュ設計ストラテジー、キャッシュオブジェクトデザイン規定、キャッシュデータ構成、キャッシュオブジェクトシリアライゼーションなどなど、ひとつひとつのトピックが多くの議論を必要とします。
この記事をきっかけにして、キャッシュというパンドラの箱を開いていただき、スピード向上の手段としてキャッシュを活用していただけることを願っております。