当ブログをご覧のみなさまこんにちは。さくらインターネット研究所の大久保です。
前回の投稿(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)は、以下のような文法となります。
<コマンド> <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を利用するには少々不便ですので、次回はいくつかのメジャーな言語のクライアントライブラリのインストール方法、使い方について説明したいと思います。
[…] This post was mentioned on Twitter by たーちゃん, Hiroaki Asai, 鷲北 賢, 岩元忍者, 横田真俊 and others. 横田真俊 said: RT @ken_washikita: さくらインターネット研究所ブログ memcachedプロトコルについて http: […]
memcacheのプロトコルはkvsの標準に
なりつつありますね。
色々なプロダクトが対応してますし。
okuyamaも遅ればせながら対応しました。
標準化の流れとかが動き出すんでしょうか。
[…] memcachedプロトコルについて – さくらインターネット研究所 […]
KH9Iex I’m not easily impressed. . . but that’s impressing me! :)