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

memcachedの特徴
memcachedは非常に高速に動作する分散キャッシュサーバですが、
- シンプルなプロトコル
- libeventによるイベントハンドリング
- 内蔵のオンメモリストレージ
- memcached同士での通信は行わない分散方式
シンプルなプロトコル
memcachedのサーバとクライアントの通信は、
$ telnet localhost 11211 Trying 127.0.0. 1... Connected to localhost. localdomain (127. 0.0. 1). Escape character is '^]'. set foo 0 0 3 (保存コマンド) bar(データ) STORED(結果) get foo(取得コマンド) VALUE foo 0 3(データ) bar(データ)
プロトコルについてのドキュメントはmemcachedのソースコード内にあります。以下のURLでも参照することができます。
libeventによるイベントハンドリング
libeventとは、
- libevent
- http://
www. monkey. org/~provos/ libevent/ - The C10K Problem
- http://
www. kegel. com/ c10k. html
内蔵のオンメモリストレージ
memcachedに保存したデータは、
memcached同士での通信は行わない分散方式
memcachedは

次はmemcachedの利用方法について簡単に紹介します
memcahedの導入
memchedの導入は比較的簡単です。ここではインストールについて解説します。
memcachedはさまざまなplatformで動作します。
- Linux
- FreeBSD
- Solrais
(memcached 1. 2.5以上) - Mac OS X
また、
memcachedのインストール
memcachedの動作には、
$ sudo yum install libevent libevent-devel
memcachedのソースコードは、
- memcached: download
- http://
www. danga. com/ memcached/ download. bml
memcachedの導入は一般的なアプリケーションと同じく、
$ 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の起動
ターミナル上で次のコマンドを打つと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)
debug用のメッセージがでてきましたが、
デーモンとしてバックグラウンドで起動する場合は、
$ /usr/local/bin/memcached -p 11211 -m 64m -d
とします。
ここで利用したmemcachedの起動オプションの内容は以下のようになります
オプション | 説明 |
---|---|
-p | 利用するTCPのポート。デフォルトは11211 |
-m | 最大のメモリーサイズ。デフォルトは64MB |
-vv | very verboseモードで起動してデバックメッセージやエラーをコンソールへ出力 |
-d | memcachedをデーモンとしてバックグラウンドで起動 |
memcachedのよく利用する起動オプションは上で紹介した4つになりますが、
$ /usr/local/bin/memcached -h
とすると表示されます。memcachedのさまざまな動作を変更できるオプションもありますので一度目を通してみるとよいでしょう。
クライアントライブラリで接続する
memcachedに接続をするクライアントラブイラリには、
- Perl
- PHP
- Python
- Ruby
- C#
- C/
C++ - Lua
などがあります。
- memcached: client apis
- http://
www. danga. com/ memcached/ apis. bml
ここでは、
Cache::Memcachedの利用
Perlのmemcachedクライアントは、
- Cache::Memcached
- Cache::Memcached::Fast
- Cache::Memcached::libmemcached
など、
- Cache::Memcached - search.
cpan. org - http://
search. cpan. org/ dist/ 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を付ける |
なお、
データの保存
memcachedへデータを保存するメソッドは、
- add
- replace
- set
になります。3つとも使い方は同じです。
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時間(秒)');
通常1つ目の引数にキーを指定してデータを削除しますが、
インクリメントとデクリメント操作
memcached上の特定のキーの値をカウンターのように利用できます。
my $ret = $memcached->incr('キー');
$memcached->add('キー', 0) unless defined $ret;
インクリメントとデクリメントはアトミックな操作になりますが、
まとめ
今回はmemcachedの簡単な紹介と導入、
次回はmemcachedの内部構造について前坂が説明いたします。memcachedのインターナルの部分がわかるとmemcachedをどのように活用していったらWebアプリケーションをさらに高速化できるかがわかると思うので、