memcachedを知り尽くす

第1回 memcachedの基本

この記事を読むのに必要な時間:およそ 4 分

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へ接続する例になります。

#!/usr/bin/perl

use strict;
use warnings;
use Cache::Memcached;

my $key = "foo";
my $value = "bar";
my $expires = 3600; # 1 hour
my $memcached = Cache::Memcached->new({
    servers => ["127.0.0.1:11211"],
    compress_threshold => 10_000
});

$memcached->add($key, $value, $expires);
my $ret = $memcached->get($key);
print "$ret\n";

ここでは,Cache::MemcachedにmemcachedサーバのIPアドレスとオプションを1つ指定してインスタンスを作成しています。Cache::Memcachedでよく用いられるオプションは以下の通りです。

オプション説明
serversmemcachedのサーバとポートを配列で指定
compress_thresholdデータを圧縮する場合の値
namespaceキーに指定したprefixを付ける

なお,Cache::MemcachedではPerlの複雑なデータをStorableモジュールでシリアライズして保存することができるので,ハッシュや配列,オブジェクト等をそのままmemcachedに保持することができます。

データの保存

memcachedへデータを保存するメソッドは,

  • add
  • replace
  • set

になります。3つとも使い方は同じです。

my $add = $memcached->add( 'キー', '', '期限' );
my $replace = $memcached->replace( 'キー', '', '期限' );
my $set = $memcached->set( 'キー', '', '期限' );

期限(秒)をつけてデータをmemcachedに保存します。期限を指定しない場合はmemcachedのLRUに基づいてデータを保持します。この3つのメッソドの違いは,

オプション説明
add同じキーのデータがストレージ上にない場合のみ値を保存
replace同じキーのデータがすでにストレージ上にあった場合のみ値を保存
setaddとreplaceと違い,どんな場合でも値を保存

となります。

データの取得

データの取得は,getとget_multiメソッドを利用します。

my $val = $memcached->get('キー');
my $val = $memcached->get_multi('キー1', 'キー2', 'キー3', 'キー4', 'キー5');

一度にデータを取得する場合は,get_multiを利用します。get_multiを利用すると,memcachedに対して複数のキーを非同期で取りにいくことができます。getをループで処理するよりも数十倍高速にデータを取得できます。

データの削除

データの削除は,deleteメソッドになりますが,1つユニークな機能があります。

$memcached->delete('キー', 'block時間(秒)');

通常1つ目の引数にキーを指定してデータを削除しますが,2つ目の引数を与えることで一定時間,新しいデータを同じキーで保存できないようにすることができます。この機能はキャッシュデータの不整合を防ぐ目的に使うことができます。ただし,setメソッドを利用するとこのブロックに関係なくデータを保存することができますので注意してください。

インクリメントとデクリメント操作

memcached上の特定のキーの値をカウンターのように利用できます。

my $ret = $memcached->incr('キー');
$memcached->add('キー', 0) unless defined $ret;

インクリメントとデクリメントはアトミックな操作になりますが,初期値が入ってない場合に自動的に「0」をいれたりという動作をしません。エラーをチェックして初期値を入れる必要がありまます。また232を超えたときの動作もサーバ側ではチェックしません。

まとめ

今回はmemcachedの簡単な紹介と導入,PerlのクライアントであるCache::Memcachedの利用法について簡単に説明させていただきました。memcachedを使うのはかなり簡単であることが理解して頂けたと思います。

次回はmemcachedの内部構造について前坂が説明いたします。memcachedのインターナルの部分がわかるとmemcachedをどのように活用していったらWebアプリケーションをさらに高速化できるかがわかると思うので,次回もお楽しみにお待ちください。

著者プロフィール

長野雅広(ながの まさひろ)

株式会社ミクシィ 開発部システム運用グループ アプリケーション運用チーム所属。mixiのアプリケーション運用に携わっています。Perlのカンファレンス,YAPC::Asia 2008でもmemcachedに関する発表を行いました。

URLhttp://blog.nomadscafe.jp/