データの永続化についてはあまり考慮されていません。メモリストレージについての詳しい情報はこの連載の2回目以降に前坂が書きますので、そちらを参考にして頂ければと思います。
memcached同士での通信は行わない分散方式
memcachedは「分散」キャッシュサーバですが、分散に関しての機能はサーバ側には備わっていません。memcached同士で通信を行って情報をシェアすることはありません。どのようにして分散を行うかというと、すべてクライアント側の実装に依存するようになっています。memcachedの分散についてはこの連載の中で取り扱っていく予定です。
次はmemcachedの利用方法について簡単に紹介します
memcahedの導入
memchedの導入は比較的簡単です。ここではインストールについて解説します。
memcachedはさまざまなplatformで動作します。
- Linux
- FreeBSD
- Solrais(memcached 1.2.5以上)
- Mac OS X
また、Windowsにもインストールすることができます。
ここではFedora 8を利用して解説します。
memcachedのインストール
memcachedの動作には、最初に紹介したlibeventというライブラリが必要になります。Fedora 8にはrpmのパッケージが用意されているので、yumコマンドを利用してインストールしてしまいます。
memcachedのソースコードは、memcachedのサイトからダウンロードできます。執筆時の最新バージョンは1.2.5になります。Fedora 8ではmemcachedもrpmが用意されているのですが、 バージョンが古く、ソースから簡単にインストールが可能なので今回はrpmを利用しません。
- memcached: download
- http://www.danga.com/memcached/download.bml
memcachedの導入は一般的なアプリケーションと同じく、configure、make、make installで完了です。
デフォルトでは、/usr/local/bin以下にmemcachedがインストールされます。
memcachedの起動
ターミナル上で次のコマンドを打つとmemcachedが起動します。
debug用のメッセージがでてきましたが、これでTCPのPort 11211をlistenして、最大64MBのメモリーを利用するmemcachedがフォアグラウンドで起動しました。 debugメッセージの内容の多くはストレージについてのメッセージですが詳しくは次回の連載で説明いたします。
デーモンとしてバックグラウンドで起動する場合は、
とします。
ここで利用したmemcachedの起動オプションの内容は以下のようになります
オプション | 説明 |
-p | 利用するTCPのポート。デフォルトは11211 |
-m | 最大のメモリーサイズ。デフォルトは64MB |
-vv | very verboseモードで起動してデバックメッセージやエラーをコンソールへ出力 |
-d | memcachedをデーモンとしてバックグラウンドで起動 |
memcachedのよく利用する起動オプションは上で紹介した4つになりますが、そのほかにもいくつかのオプションがあります。それらについては、
とすると表示されます。memcachedのさまざまな動作を変更できるオプションもありますので一度目を通してみるとよいでしょう。
クライアントライブラリで接続する
memcachedに接続をするクライアントラブイラリには、PerlやPHPをはじめ、さまざまな言語の実装があります。memcachedのサイトに載っている言語だけでも、
- Perl
- PHP
- Python
- Ruby
- C#
- C/C++
- Lua
などがあります。
- memcached: client apis
- http://www.danga.com/memcached/apis.bml
ここでは、mixiでも利用しているPerlのライブラリでのmemcachedへの接続方法を紹介いたします。
Cache::Memcachedの利用
Perlのmemcachedクライアントは、
- Cache::Memcached
- Cache::Memcached::Fast
- Cache::Memcached::libmemcached
など、いくつかのモジュールがCPANに公開されています。ここで紹介するCache::Memcachedはmemcachedを作成したBrad Fitzpatrick氏によるもので、memcachedのクライアントとして最も利用されているモジュールだと思われます。
- Cache::Memcached - search.cpan.org
- http://search.cpan.org/dist/Cache-Memcached/
Cache::Memcachedを用いたmemcachedへの接続
以下のソースコードは、Cache::Memcachedを用いて先ほど起動したmemcachedへ接続する例になります。
ここでは、Cache::MemcachedにmemcachedサーバのIPアドレスとオプションを1つ指定してインスタンスを作成しています。Cache::Memcachedでよく用いられるオプションは以下の通りです。
オプション | 説明 |
servers | memcachedのサーバとポートを配列で指定 |
compress_threshold | データを圧縮する場合の値 |
namespace | キーに指定したprefixを付ける |
なお、Cache::MemcachedではPerlの複雑なデータをStorableモジュールでシリアライズして保存することができるので、ハッシュや配列、オブジェクト等をそのままmemcachedに保持することができます。
データの保存
memcachedへデータを保存するメソッドは、
になります。3つとも使い方は同じです。
期限(秒)をつけてデータをmemcachedに保存します。期限を指定しない場合はmemcachedのLRUに基づいてデータを保持します。この3つのメッソドの違いは、
オプション | 説明 |
add | 同じキーのデータがストレージ上にない場合のみ値を保存 |
replace | 同じキーのデータがすでにストレージ上にあった場合のみ値を保存 |
set | addとreplaceと違い、どんな場合でも値を保存 |
となります。
データの取得
データの取得は、getとget_multiメソッドを利用します。
一度にデータを取得する場合は、get_multiを利用します。get_multiを利用すると、memcachedに対して複数のキーを非同期で取りにいくことができます。getをループで処理するよりも数十倍高速にデータを取得できます。
データの削除
データの削除は、deleteメソッドになりますが、1つユニークな機能があります。
通常1つ目の引数にキーを指定してデータを削除しますが、2つ目の引数を与えることで一定時間、新しいデータを同じキーで保存できないようにすることができます。この機能はキャッシュデータの不整合を防ぐ目的に使うことができます。ただし、setメソッドを利用するとこのブロックに関係なくデータを保存することができますので注意してください。
インクリメントとデクリメント操作
memcached上の特定のキーの値をカウンターのように利用できます。
インクリメントとデクリメントはアトミックな操作になりますが、初期値が入ってない場合に自動的に「0」をいれたりという動作をしません。エラーをチェックして初期値を入れる必要がありまます。また232を超えたときの動作もサーバ側ではチェックしません。
まとめ
今回はmemcachedの簡単な紹介と導入、PerlのクライアントであるCache::Memcachedの利用法について簡単に説明させていただきました。memcachedを使うのはかなり簡単であることが理解して頂けたと思います。
次回はmemcachedの内部構造について前坂が説明いたします。memcachedのインターナルの部分がわかるとmemcachedをどのように活用していったらWebアプリケーションをさらに高速化できるかがわかると思うので、次回もお楽しみにお待ちください。