memcached
>ふと
>memcached
> の
>プロトコル
>を調べたが、ちょお簡単だった。 HaskellNet に実装しようかな。でも HaskellNet のカバーする範疇とはちょっと違うかなあ。
>
>簡単なので解説する。 memcached へは TCP でコネクションを張る(コネクションは必要なたびに接続しなおすのではなく、一回つないで使いまわすことを推奨している)。クライアントが使えるコマンドは、set、add、replace、get、delete、incr、decr、stats、version、quit。
>
>set、add、replace はデータを memcached に送り込む命令。 add はキーを新規作成しデータに対応づけるので、すでにキーがあるとエラー。 replace は既存のキーに対応するデータを置き換えるため、キーがないとエラー。 set はなければ作り、あったら置き換えるのでエラーはない。
>
>この3つのコマンドは、まず空白で区切られる4つの値を引数に与え、 crlf を与えてからデータを与え、 crlf を与える。つまり書式は次のような感じ。
>
>cmd key flags expire bytes\r\n
DATA\r\n > >key は任意の文字列で、これがキーになる(ただし空白などは含められない?)。 flags は適当な数値を与える。 memcached 側はキーに対応して覚えているだけで意味は斟酌しない。クライアントが適当に意味付けして使ってよい。 expire は期限切れまでの時間で、これを過ぎるとキーに対応するデータは消滅する。 expire は秒単位の数値で指定するが、30日以内の数値であれば「現在時刻から何秒後か」を意味し、それより大きいときには expire する日時の UNIX epoch からの秒数指定であると判断する。 expire に 0 を指定すると、明示的に delete しないかぎり消滅しない。 bytes はデータのバイト数(crlfは含まない)。 DATA は crlf を末尾と判断するため、含んではいけない。crlf が含まれる場合、無効な命令と判断して単に何もしないようである。 > >get はデータを取り出す命令。引数としてはキーを1つ以上与える(空白で区切る)。サーバからの返答は、 > >VALUE key flags bytes\r\n
some_data\r\n > >の形式を取る。 key、flags、bytes は set などと意味は同じ。 some_data のところが実際のデータになっている。キーに対応するデータがないときには END とだけ返される。 > >delete はキーに対応するデータを削除する。オプションとして数値を指定できる。この数値の意味は set などの expire と同じで、その時刻までは set などを無視する(deleteされたままにしておく)という期限を設定する。これを指定しないと 0 、つまりすぐに再作成可能状態になる。 > >stats はサーバステータス情報を返す。 version はバージョン情報を返す。 quit は接続の終了を指示する。ただしクライアントはこのコマンドなしにいきなり接続を切断してよい。 > >incr と decr は特殊なデータ操作コマンド。キーと数値を与える。そのキーに対応するデータを数値とみなして、引数に与えた数値のぶんだけ増やしたり減らしたりして置き換える。データが数値じゃないときには 0 とみなすようだ。 decr で 0 以下になったときには 0 でストップするが、 incr でオーバフローするときの動作は未定義。ふつうにオーバフローしているようだ。 > >以上。 >
DATA\r\n > >key は任意の文字列で、これがキーになる(ただし空白などは含められない?)。 flags は適当な数値を与える。 memcached 側はキーに対応して覚えているだけで意味は斟酌しない。クライアントが適当に意味付けして使ってよい。 expire は期限切れまでの時間で、これを過ぎるとキーに対応するデータは消滅する。 expire は秒単位の数値で指定するが、30日以内の数値であれば「現在時刻から何秒後か」を意味し、それより大きいときには expire する日時の UNIX epoch からの秒数指定であると判断する。 expire に 0 を指定すると、明示的に delete しないかぎり消滅しない。 bytes はデータのバイト数(crlfは含まない)。 DATA は crlf を末尾と判断するため、含んではいけない。crlf が含まれる場合、無効な命令と判断して単に何もしないようである。 > >get はデータを取り出す命令。引数としてはキーを1つ以上与える(空白で区切る)。サーバからの返答は、 > >VALUE key flags bytes\r\n
some_data\r\n > >の形式を取る。 key、flags、bytes は set などと意味は同じ。 some_data のところが実際のデータになっている。キーに対応するデータがないときには END とだけ返される。 > >delete はキーに対応するデータを削除する。オプションとして数値を指定できる。この数値の意味は set などの expire と同じで、その時刻までは set などを無視する(deleteされたままにしておく)という期限を設定する。これを指定しないと 0 、つまりすぐに再作成可能状態になる。 > >stats はサーバステータス情報を返す。 version はバージョン情報を返す。 quit は接続の終了を指示する。ただしクライアントはこのコマンドなしにいきなり接続を切断してよい。 > >incr と decr は特殊なデータ操作コマンド。キーと数値を与える。そのキーに対応するデータを数値とみなして、引数に与えた数値のぶんだけ増やしたり減らしたりして置き換える。データが数値じゃないときには 0 とみなすようだ。 decr で 0 以下になったときには 0 でストップするが、 incr でオーバフローするときの動作は未定義。ふつうにオーバフローしているようだ。 > >以上。 >