memcachedとは
memcachedは、汎用的な分散型インメモリキャッシュシステムです。元々はDanga Interactiveによって
LiveJournalサービスのために開発されましたが、現在では多くのWebサイトで利用されています。主な目的は、データやオブジェクトをメモリ内にキャッシュすることで、
データベースへのアクセス回数を減らし、Webサイトのパフォーマンスを向上させることです。memcachedは、
BSDライセンスの下で配布されるオープンソースソフトウェアです。
memcachedの仕組み
memcachedは、適切に設定された
ファイアウォールで保護されたサーバー環境での使用を推奨します。もし
ファイアウォールがない環境で使用する場合は、SASL認証オプションを有効にしてコンパイルする必要があります(バージョン1.4.3以降)。デフォルトでは、ポート11211番を使用し、イベント処理にはlibeventライブラリを使用します。
memcachedは、複数のマシンに分散された巨大な
ハッシュテーブルを提供します。この
ハッシュテーブルが満杯になると、最も古いデータから順に削除され、新しいデータが挿入されます。アプリケーションは、
データベースのような低速なストレージへのアクセスを行う前に、memcachedにリクエストを行います。
memcachedの利用事例
memcachedは、YouTube、
LiveJournal、Wikipedia、SourceForge、
Facebook、
Digg、Fotologなど、数多くの大規模なWebサイトで利用されています。これらのサイトでは、memcachedを利用することで、大量のアクセスを効率的に処理し、高速な応答を実現しています。
サンプルコード
データベースやオブジェクト生成の
クエリをmemcachedを利用するように変更するのは比較的簡単です。
以下に、単純な
データベースクエリを例に、memcachedを使用する場合としない場合のコードを比較してみましょう。
memcachedを使用しない場合
function get_foo (int userid) {
result = db_select("SELECT FROM users WHERE userid = ?", userid);
return result;
}
このコードは、useridをキーとして
データベースからユーザー情報を取得する関数です。
memcachedを使用する場合
function get_foo (int userid) {
result = memcached_fetch("userrow:" + userid);
if (!result) {
result = db_select("SELECT FROM users WHERE userid = ?", userid);
memcached_add("userrow:" + userid, result);
}
return result;
}
このコードでは、まずmemcachedから"userrow:userid"というキーに対応するデータを取得します。もしデータが見つからなければ、
データベースからユーザー情報を取得し、取得したデータをmemcachedに追加します。
データ更新時の注意点
`get_foo`関数だけを変更しても、
データベースの更新を行う部分を変更しないと、memcachedに古いデータがキャッシュされたままになる可能性があります。そのため、データの更新時にはmemcachedの`set`関数を使用する必要があります。
function update_foo(int userid, string dbUpdateString) {
result = db_execute(dbUpdateString);
if (result) {
data = createUserDataFromDBString(dbUpdateString);
memcached_set("userrow:" + userid, data);
}
}
このコードでは、
データベースの更新が成功した場合、memcachedのデータを最新の状態に更新しています。
キャッシュの無効化
別の方法として、memcachedの`delete`関数を使用してキャッシュを無効化することも可能です。これにより、次回のリクエスト時にキャッシュミスが発生し、
データベースから最新のデータを取得するようになります。
まとめ
memcachedは、Webアプリケーションのパフォーマンスを向上させるための強力なツールです。適切な設定と利用方法を理解することで、Webサイトの応答速度を大幅に改善することができます。
公式リンク
memcached 公式ウェブサイト