アーカイブ

memcachedプロトコルについて

当ブログをご覧のみなさまこんにちは。さくらインターネット研究所の大久保です。

前回の投稿(Key Value Storeについて)に引き続き、今回はKVS関連としてmemcachedプロトコルの詳細を説明したいと思います。

memcachedプロトコルは前回ご説明しましたとおり、以下のようなものです。

  1. KVSにネットワーク経由でアクセスするための事実上標準プロトコル
  2. TCP 11211番ポートを使用 (*1)
  3. テキストベースのプロトコル (*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)は、以下のような文法となります。

<コマンド> <key> <flags> <exptime> <bytes>
<data>
  • <key>は保存するためのキー名を指定します。実装によっても異なりますが、最大長は250byteです。
  • <flags>はアプリケーション特有の32bitの値(0〜4294967295)を指定することができ、データの取得時に格納した時の値が返されます。
  • <exptime>はデータの有効期間を秒数で指定します。指定した時間経過すると、自動的にキーが削除されます。0を指定すると自動削除されませんが、memcachedのようにキャッシュで動いている場合は、キャッシュの容量によって自動削除されることもあります。
  • <bytes>は以下の<data>で指定するデータのサイズです。例えば”abcde”と5文字を格納する場合は、5と指定します。
  • <data>は格納するデータです。実装によっても異なりますが、最大長は約1MBytesとなります。

データの取得・削除を行うコマンド(get,delete)は、以下のような文法となり、引数に対象のキー名を指定します。

<コマンド> <key>

値の加減算を行うコマンド(incr,decr)は、以下のような文法となり、引数に対象のキー名と加減算する数値を指定します。

<コマンド> <key> <value>

では、これらのコマンドをいくつか実際に試してみます。

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を利用するには少々不便ですので、次回はいくつかのメジャーな言語のクライアントライブラリのインストール方法、使い方について説明したいと思います。

4 comments to memcachedプロトコルについて

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

  

  

  

エラー: si-captcha.phpプラグインによると、PHPにGD image supportが見当たりません!

PHPにGD image supportが有効になっていない理由については、サーバ管理者にお問合せください。

エラー: si-captcha.phpプラグインによると、PHPにimagepng機能が見当たりません!

PHPにimagepng機能が有効になっていない理由については、サーバ管理者にお問合せください。