memcachedプロトコルのmulti getについて

memcachedプロトコルは典型的なkey-value storeプロトコルデファクトスタンダードになりつつあります。
いろんな言語から簡単に呼び出せる環境が整備されており、大変便利です。


memcachedプロトコルの中で基本として使われるgetですが
複数のkeyを指定することで複数のvalueを獲得できます。multi getなんて名前で呼ぶとそういうコマンドかと思ってしまいますがコマンドとして存在するのはgetのみです。


こんな感じでsetしておいたキーを

set hoge 0 0 4
fuga
STORED
set foo 0 0 3
bar
STORED

getするならこんな感じ。
上が存在するキーをgetした例、下が存在しないキーをgetした例

get hoge
fuga
END

get hogehoge
END

ここからが本題、複数のkeyをgetする場合の動作

get hoge foo
VALUE hoge 0 4
fuga
VALUE foo 0 3
bar
END

VALUE hoge 0 4だのと先ほどには無かった物が付いてきます。

存在しないkeyを指定した場合はこんな感じ

get hoge hogehoge foo
VALUE hoge 0 4
fuga
VALUE foo 0 3
bar
END

見つかったkeyだけ表示してくれます。向こうから送信されるデータに限って言うならさっきと全く一緒。
hoge と fooの順さえ一緒ならどこにhogehogeを挟んでも全く同じ挙動を取ります。

get hoge hogehoge foo
VALUE hoge 0 4
fuga
VALUE foo 0 3
bar
END
get hoge foo hogehoge
VALUE hoge 0 4
fuga
VALUE foo 0 3
bar
END
get hogehoge hoge foo
VALUE hoge 0 4
fuga
VALUE foo 0 3
bar
END

一切見つからなかった場合の挙動は単一keyと変わりません。

get a b
END

要するに、
『複数のkeyを指定した場合は、valueがどのkeyに対応するものなのか紐付けを明白にして見つかったものだけ返してくれる。』という挙動のようです。
プロトコルをパースする立場からは、むしろkeyが1個しかない場合の動作の方を特異と考えるべきかもしれません。memcachedプロトコルを採用する場合は気をつけましょう。


memcachedクライアントは可能な限りkeyをまとめて送付するほうが多くの場合でスループットが出そうです。
世に出ているmemcachedクライアントライブラリは複数のkeyのvalueを一斉にgetする手段を提供している物も多いようですので積極的に使いましょう。

あと細かいこと
いっぱいgetしてみた

get a b c d e f g h i j k a b c
VALUE a 0 1
1
VALUE b 0 1
2
VALUE c 0 1
3
VALUE d 0 1
4
VALUE e 0 1
f
VALUE f 0 1
g
VALUE g 0 1
5
VALUE h 0 1
6
VALUE a 0 1
1
VALUE b 0 1
2
VALUE c 0 1
3
END

同時get出来る個数の上限は不明。ソースの読みが甘かったのでもっとがんばります。