株式会社ミクシィ 開発部 システム運用グループの長野です。普段はミクシィのアプリケーション運用を担当しております。今回から数回にわたり、
memcachedとは
memcachedは、
多くのWebアプリケーションは、
そこでmemcachedが活躍します。memcachedは高性能な分散メモリキャッシュサーバです。通常、

memcachedの特徴
memcachedは非常に高速に動作する分散キャッシュサーバですが、
- シンプルなプロトコル
- libeventによるイベントハンドリング
- 内蔵のオンメモリストレージ
- memcached同士での通信は行わない分散方式
シンプルなプロトコル
memcachedのサーバとクライアントの通信は、 プロトコルについてのドキュメントはmemcachedのソースコード内にあります。以下のURLでも参照することができます。 libeventとは、 memcachedに保存したデータは、 memcachedは 次はmemcachedの利用方法について簡単に紹介します memchedの導入は比較的簡単です。ここではインストールについて解説します。 memcachedはさまざまなplatformで動作します。 また、 memcachedの動作には、 memcachedのソースコードは、 memcachedの導入は一般的なアプリケーションと同じく、 デフォルトでは、 ターミナル上で次のコマンドを打つとmemcachedが起動します。 debug用のメッセージがでてきましたが、 デーモンとしてバックグラウンドで起動する場合は、 とします。 ここで利用したmemcachedの起動オプションの内容は以下のようになります memcachedのよく利用する起動オプションは上で紹介した4つになりますが、 とすると表示されます。memcachedのさまざまな動作を変更できるオプションもありますので一度目を通してみるとよいでしょう。 memcachedに接続をするクライアントラブイラリには、 などがあります。 ここでは、 Perlのmemcachedクライアントは、 など、 以下のソースコードは、 ここでは、 なお、 memcachedへデータを保存するメソッドは、 になります。3つとも使い方は同じです。 期限 となります。 データの取得は、 一度にデータを取得する場合は、 データの削除は、 通常1つ目の引数にキーを指定してデータを削除しますが、 memcached上の特定のキーの値をカウンターのように利用できます。 インクリメントとデクリメントはアトミックな操作になりますが、 今回はmemcachedの簡単な紹介と導入、 次回はmemcachedの内部構造について前坂が説明いたします。memcachedのインターナルの部分がわかるとmemcachedをどのように活用していったらWebアプリケーションをさらに高速化できるかがわかると思うので、$ telnet localhost 11211
Trying 127.
libeventによるイベントハンドリング
内蔵のオンメモリストレージ
memcached同士での通信は行わない分散方式
memcahedの導入
memcachedのインストール
$ sudo yum install libevent libevent-devel
$ wget http://www.danga.com/memcached/dist/memcached-1.2.5.tar.gz
$ tar zxf memcached-1.2.5.tar.gz
$ cd memcached-1.2.5
$ ./configure
$ make
$ sudo make install
memcachedの起動
$ /usr/local/bin/memcached -p 11211 -m 64m -vv
slab class 1: chunk size 88 perslab 11915
slab class 2: chunk size 112 perslab 9362
slab class 3: chunk size 144 perslab 7281
中略
slab class 38: chunk size 391224 perslab 2
slab class 39: chunk size 489032 perslab 2
<23 server listening
<24 send buffer was 110592, now 268435456
<24 server listening (udp)
<24 server listening (udp)
<24 server listening (udp)
<24 server listening (udp)
$ /usr/local/bin/memcached -p 11211 -m 64m -d
オプション 説明
-p 利用するTCPのポート。デフォルトは11211
-m 最大のメモリーサイズ。デフォルトは64MB
-vv very verboseモードで起動してデバックメッセージやエラーをコンソールへ出力
-d memcachedをデーモンとしてバックグラウンドで起動
$ /usr/local/bin/memcached -h
クライアントライブラリで接続する
Cache::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";
オプション 説明
servers memcachedのサーバとポートを配列で指定
compress_ データを圧縮する場合の値
namespace キーに指定したprefixを付ける
データの保存
my $add = $memcached->add( 'キー', '値', '期限' );
my $replace = $memcached->replace( 'キー', '値', '期限' );
my $set = $memcached->set( 'キー', '値', '期限' );
オプション 説明
add 同じキーのデータがストレージ上にない場合のみ値を保存
replace 同じキーのデータがすでにストレージ上にあった場合のみ値を保存
set addとreplaceと違い、
データの取得
my $val = $memcached->get('キー');
my $val = $memcached->get_multi('キー1', 'キー2', 'キー3', 'キー4', 'キー5');
データの削除
$memcached->delete('キー', 'block時間(秒)');
インクリメントとデクリメント操作
my $ret = $memcached->incr('キー');
$memcached->add('キー', 0) unless defined $ret;
まとめ