memcachedプロトコルについて
当ブログをご覧のみなさまこんにちは。さくらインターネット研究所の大久保です。
前回の投稿(Key Value Storeについて)に引き続き、今回はKVS関連としてmemcachedプロトコルの詳細を説明したいと思います。
memcachedプロトコルは前回ご説明しましたとおり、以下のようなものです。
- KVSにネットワーク経由でアクセスするための事実上標準プロトコル
- TCP 11211番ポートを使用 (*1)
- テキストベースのプロトコル (*2)
(*1) 実装によってはUDPをサポートしているものもあります。 (*2) 実装によってはバイナリプロトコルをサポートしているものもあります。
今回はmemcachedをインストールして、実際にいくつかのコマンドを動かしてみます。
memcachedのインストール・起動
ここではFreeBSDを例に説明します。FreeBSDでは以下のようにportsを使って簡単にインストールすることができます。
# cd /usr/ports/databases/memcached
# make install
コンパイルとインストールが終わったら以下のようにしてデーモンの起動を行います。
# vi /etc/rc.conf
(以下の行を追加して保存します)
memcached_enable="YES"
# /usr/local/etc/rc.d/memcached start
以下のようにmemcachedが11211番ポートを待ち受ければ起動成功です。IPv6にも対応していますね。
% sockstat|grep memcached
nobody memcached 35580 16 tcp6 *:11211 *:*
nobody memcached 35580 17 tcp4 *:11211 *:*
nobody memcached 35580 18 udp6 *:11211 *:*
nobody memcached 35580 19 udp4 *:11211 *:*
memcachedプロトコルのコマンド一覧
memcachedプロトコルの主なコマンドを以下表に示します。
コマンド | 機能 | 備考 |
set | データの保存 | |
add | データの保存 | キーが既に存在しない場合のみ |
replace | データの保存 | キーが既に存在する場合のみ |
append | 値への後方追加 | |
prepend | 値への前方追加 | |
get | データの取得 | |
delete | データの削除 | |
incr | 値への加算 | |
decr | 値への減算 | |
stats | 各種ステータスを表示 | |
version | ソフトウェアのバージョンを表示 |
※ memcachedプロトコルの仕様書は以下にあります。 http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt
データの保存を行うコマンド(set,add,replace,append,prepend)は、以下のような文法となります。
<コマンド>
- は保存するためのキー名を指定します。実装によっても異なりますが、最大長は250byteです。
- はアプリケーション特有の32bitの値(0〜4294967295)を指定することができ、データの取得時に格納した時の値が返されます。
- はデータの有効期間を秒数で指定します。指定した時間経過すると、自動的にキーが削除されます。0を指定すると自動削除されませんが、memcachedのようにキャッシュで動いている場合は、キャッシュの容量によって自動削除されることもあります。
- は以下ので指定するデータのサイズです。例えば”abcde”と5文字を格納する場合は、5と指定します。
- は格納するデータです。実装によっても異なりますが、最大長は約1MBytesとなります。
データの取得・削除を行うコマンド(get,delete)は、以下のような文法となり、引数に対象のキー名を指定します。
<コマンド>
値の加減算を行うコマンド(incr,decr)は、以下のような文法となり、引数に対象のキー名と加減算する数値を指定します。
<コマンド>
では、これらのコマンドをいくつか実際に試してみます。
ookubo@corn ~% telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
--- set,getコマンド ---
set name 12345 0 6
sakura
STORED
get name
VALUE name 12345 6
sakura
END
--- replaceコマンド ---
replace name 54321 0 6
ohkubo
STORED
get name
VALUE name 54321 6
ohkubo
END
--- appendコマンド ---
append name 0 0 3
123
STORED
get name
VALUE name 54321 9
ohkubo123
END
--- prependコマンド ---
prepend name 0 0 3
123
STORED
get name
VALUE name 54321 12
123ohkubo123
END
--- deleteコマンド ---
delete name
DELETED
get name
END
--- incr,decrコマンド ---
set age 0 0 2
29
STORED
incr age 10
39
decr age 9
30
get age
VALUE age 0 2
30
END
--- statsコマンド ---
stats
STAT pid 35580
STAT uptime 71089
STAT time 1268969708
STAT version 1.4.4
STAT pointer_size 32
STAT rusage_user 0.136690
STAT rusage_system 0.281422
STAT curr_connections 10
STAT total_connections 16
STAT connection_structures 11
STAT cmd_get 29
STAT cmd_set 24
STAT cmd_flush 0
STAT get_hits 22
STAT get_misses 7
STAT delete_misses 1
STAT delete_hits 4
STAT incr_misses 0
STAT incr_hits 3
STAT decr_misses 0
STAT decr_hits 1
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 1111
STAT bytes_written 1864
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 54
STAT curr_items 1
STAT total_items 20
STAT evictions 0
END
--- versionコマンド ---
version
VERSION 1.4.4
--- 終了 ---
quit
おわりに
今回はmemcachedプロトコルのコマンドについて説明させていただきました。ただ、telnetで接続して直接コマンドを入力する方法では、アプリケーションからKVSを利用するには少々不便ですので、次回はいくつかのメジャーな言語のクライアントライブラリのインストール方法、使い方について説明したいと思います。