okuyamaのSerializeMapを検証してみた
昨日@kumagi さんと@muga_nishizawa さんとtwitter上でやり取り(http://togetter.com/li/149955)をした時に話題に出した
次のokuyamaに入れようと思っている機能の一つのSerializeMapですが、
あの時、性能の話題になったのでまだ正式にはリリース前なんですが
性能を簡単に測定してみました。
実装したタイミングで簡単には試していたのですが、自分の備忘録代わりに再テストの記録。
そもそもこのSerializeMapの仕組みですが、このMapは内部で1つだけMapオブジェクトを
持っていてこのMapはあらかじめ決められた要素数しかKeyとValueのセットを持たないようになっています。
そして全ての要素はIntegerオブジェクトをKeyとして、ValueにシリアライズされたMapのバイナリ
配列をもちます。このバイナリ配列化されたMapを逐次、デシリアライズてそこに値をつめて、
またシリアライズして大本のMapに登録し直します。決められた要素のどこのMapに入るかは
登録時のKey値のHash値を使って素数で割ってその余りの場所に格納しています。この大本Mapの
要素数は引数で渡して調整出来るようになっています。
狙いはメモリ中に存在しているMapオブジェクトの要素数を増やさないことです。
要素内のシリアライズされたバイトデータは増えますが、要素数そのものが増えることに
よるオブジェクトの構成要素が占めるメモリ中の容量よりもマシではないかと思い実装しました。
取り合えず測定の視点は、単純に秒間に実行できる性能と、メモリに対してどれぐらい保持できるかです。
参考としてConcurrentHashMapと比べてみました。
以下はSerializeMapのソース
http://sourceforge.jp/projects/okuyama/svn/view/trunk/src/okuyama/imdst/util/serializemap/SerializeMap.java?view=markup&revision=671&root=okuyama
以下はテストに利用したソース
http://sourceforge.jp/projects/okuyama/svn/view/trunk/test/SerializeMapTest.java?view=markup&revision=675&root=okuyama
テストは簡単で、テストスクリプト内で値をSetするスレッドを複数起こして、
それぞれがユニークな値をSetするというもの
このSetを一定時間繰り返してその間にSet出来た回数を実行秒数で割って秒間処理数を、
保存できる最大はOutOfMemoryが出るまで実行してメモリ当たりの最大数を見てみました。
実行回数確認時は各スレッド単位でユニークな値を200万種類の中からランダムに登録し続けたので、
新規、更新入り乱れてると思います。
実行PCのスペックは以下
マシン:ドスパラデスクトップPC
CPU:Core i5 3.2GhHz 物理2コア、仮想4コア
メモリ:4GB
OS:CentOS 5.4 64bit
JAVA:Sun Java1.6.0_25 64bit
JVMオプションは以下にしました。
- XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseParNewGC
メモリ割当は秒間当たりの処理数を調べる時は-Xmx2048m -Xms2048mで
最大数を調べるときは時間短縮のため、-Xmx512m -Xms512mで試しました。
ではまず1秒当たりのSetの数です。
同時にSetを実行するスレッド数は30です。
*ConcurrentHashMap
775030 QPS
*SerializeMap
62166 QPS
ConcurrentHashMap速い!!
77万とかいくんですね。
対して、SerializeMapは6万なので、12分の1位でしょうか。
ではつぎに、限界格納数
同時にSetを実行するスレッド数は8です。
*ConcurrentHashMap
197万6128件でOutOfMemory
*SerializeMap
2100万以上1時間半ぐらい動いた時点で止めました。
だいたい、同じメモリ量で、11倍以上格納出来ています。
格納のスピードはというと、ConcurrentHashMapは止まるまで
秒間当たり、ほぼ同じスピードでSetし続けたのに対して、
SerializeMapは以下のようになりました。
以下のログは3秒間隔でその時点のMapのsizeを出しています。
開始直後
1108159
1263967
1413241
1563692
1729365
大体、3秒で15万から16万件のペースでsizeが増えているので、
秒間当たり、5万Setできているのが分かります。
そして、1000万を超えた当たりでは、
10046581
10142857
10227589
10321581
10405751
大体、3秒で8万件から10万件程度増えているので、秒当たり、3万Setぐらでしょうか。
そして、2000万を超えたあたりでは、
19999741
20002336
20004813
20007616
20009919
大体、3秒で2000件から3000件程度増えているので、秒当たり、900Setぐらでしょうか。
内部でシリアライズ、デシリアラズを常に行い、さらに圧縮処理を行っているので、データが多くなれば
それだけ遅くなっているようです。
スピードは秒間1万Set程度でいいから大量の値を持ちたいよって時に、使えるかな。
okuyamaは内部でこれを使っているので、周りにネットワーク処理とか同期処理とか色々入るので、
この生の性能は出ませんが、データファイルの位置記録用には結構重宝しそうです。
次はGetも検証してみたいと思います。
okuyamaプロトコル仕様表
okuaymaのオリジナルプロトコルの仕様を表にまとめした。
からり表が大きく見にくくなってしまいました...orz
以降okuyama側に変更があった場合もこの表をメンテナンスしてきます。
事前説明ですが、
1.各要素間のセパレータは","になります。
2.Encode指定という部分はBase64でのEncode指定を意味します。
送信側でEncodeで○となっている部分はBase64でエンコードしてから送信することを意味し、
返却側はサーバからEncodeされた値が返されることを意味しますので、Decodeして使用してください。
3.追記
2010/01/03:肝心なことを書き忘れてました。プロトコルの終端の区切りは"\r\n"です。
2010/01/04:Valueにブランク(サイズ0の値)を指定したい場合はBase64エンコードをせずに"(B)"という文字列を指定してください。
okuyama側でブランクとして扱われます。
2010/01/04:Key値にブランク(サイズ0の値)は指定できません。エラーとしてください。
2010/01/04:Tag値に"(B)"を指定した場合は、okuyama側でTag指定なしとして処理されます。
2011/06/06:incrValue、decrValue、getMultiValue、getTagValues、removeTagFromKey、setValueAndCreateIndex、searchValueのプロトコルを追記しました。
メ ソッド名 処理内容 |
説 明 |
サー バから返却される値 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
第2 要素 |
第3 要素 |
第4 要素 |
第5 要素 |
第6 要素 |
第1 要素 |
第2 要素 |
第3 要素 |
第4 要素 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
initClient 保存可能な最大サイズをMasterNodeへ問い合わせる |
値 | |
|
|
|
|
0 | true | 数値 Valueのbyte長 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | |
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例 |
0,true,1048576 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setValue 値を保存する(Tagの有り無しで転送の第3要素が変化する) |
値 | Key値 | Tag値 Tagを指定しない場合は"(B)"を連結する。存在する場合はTag文字列を":"をセパレータに連結する |
分散ロック値 "0"固定 |
Value値 | 1 | "true" or "false" or "error" 正常に保存出来た場合は"true".なんだかの理由により論理的(サイズオーバーなど)に保存できない場合は"false".サーバ側でエラーの場合は "error" |
"OK" or メッセージ 返却第2要素が"true"の場合は"OK"になる."false"や、"error"の場合はメッセージが格納される |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | (B)の場合は× Tagが存在する場合は1Tag単位でエンコード |
× | ○ | |
× | × | × | |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例
|
例1正常保存) 1,true,OK 例2Value値サイズオーバー) 1,false,Value Length Error |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getValue Keyを指定して値を取得 |
値 | Key値 | 2 | "true" or "false" or "error" 値が取得出来た場合は"true".取得できない、なんだかの理由により論理的(サイズオーバーなど)に取得できない場合は"false".サーバ側でエ ラーの場合は"error" |
Value値 or メッセージ 返却第2要素が"true"の場合はValueになる."false"や、"error"の場合はメッセージが格納される |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | |
|
|
|
× | × | ○ or × 返却値の第2要素が"true"の場合は○.それ意外は× |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例
|
例1値あり) 2,true,dmFsdWUx 例2値なし) 2,false, 例3Key値サイズオーバー) 2,false,Key Length Error |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getTagKeys Tagを指定することでKey値を取得する |
値 | Tag値 | "true" or "false" 削除済みのKey-Valueセットの扱い.trueを指定すると、削除済みでもKey値は返される falseを指定すると、削除済みのKey値は返されない. |
4 | "true" or "false" or "error" 値が取得出来た場合は"true".取得できない、なんだかの理由により論理的(サイズオーバーなど)に取得できない場合は"false".サーバ側でエ ラーの場合は"error" |
Value値 or メッセージ 返却第2要素が"true"の場合は同じTagが打たれているKey値の連結文字列になるになる.セパレータは":" "false"や、"error"の場合はメッセージが格納される |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | × | |
|
|
× | × | ○ or × 返却値の第2要素が"true"の場合は○.それ意外は× |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例
|
例1Key値あり) 4,true,dGFnc2FtcGxlZGF0YWtleV8w:a2V5MQ==:a2V5Mw== 例2値なし) 4,false, 例3Tag値サイズオーバー) 4,false,Tag Length Error |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
removeValue Key値を指定することでKey-Valueセットを削除する |
値 | Key値 | 分散ロック値 "0"固定 |
5 | "true" or "false" or "error" 値が削除出来た場合は"true".取得できない、なんだかの理由により論理的(サイズオーバーなど)に取得できない場合は"false".サーバ側でエ ラーの場合は"error" |
Value値 or メッセージ 返却第2要素が"true"の場合は削除対象のValue値 "false"や、"error"の場合はメッセージが格納される |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | × | |
|
|
× | × | ○ or × 返却値の第2要素が"true"の場合は○.それ意外は× |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例
|
例1Key値あり) 5,true,c2F2ZWRhdGF2YWx1ZXN0cl8w 例2値なし) 5,false, 例3Key値サイズオーバー) 5,false,Key Length Error |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setNewValue 値を保存する(Tagの有り無しで転送の第3要素が変化する) 既に同値のKeyがサーバに存在する場合は失敗する memcachedの"add"命令に相当する |
値 | Key値 | Tag値 Tagを指定しない場合は"(B)"を連結する。存在する場合はTag文字列を":"をセパレータに連結する |
分散ロック値 "0"固定 |
Value値 | 6 | "true" or "false" or "error" 正常に保存出来た場合は"true".なんだかの理由により論理的(既にKeyが存在する.サイズオーバーなど)に保存できない場合は"false". サーバ側でエラーの場合は"error" |
"OK" or メッセージ 返却第2要素が"true"の場合は"OK"になる."false"や、"error"の場合はメッセージが格納される |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | (B)の場合は× Tagが存在する場合は1Tag単位でエンコード |
× | ○ | |
× | × | × | |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例
|
例1成功) 6,true,OK 例2失敗) 6,false,NG:Data has already been registered |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getValueVersionCheck 値を取得すると同時に該当Key-ValueセットのVersionNoも返す memcachedの"gets"命令に相当する |
値 | Key値 |
|
|
15 | "true" or "false" or "error" 値が取得出来た場合は"true".取得できない、なんだかの理由により論理的(サイズオーバーなど)に取得できない場合は"false".サーバ側でエ ラーの場合は"error" |
Value値 or メッセージ 返却第2要素が"true"の場合はValueになる."false"や、"error"の場合はメッセージが格納される |
VersionNo値(数値) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | |
|
|
|
× | × | ○ | × | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例
|
例1取得成功) 15,true,dmFsdWUx,0 例2取得成功VersionNo値が"2") 15,true,dmFsdWUx,2 例3値なし) 15,false,, |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setValueVersionCheck Key-Valueのセットを更新する.この際に、VersionNoを同時に渡し、VersionNoがサーバ側で変更されていない場合のみ処理が成功 する memcachedの"cas"命令に相当する |
値 | Key値 | Tag値 Tagを指定しない場合は"(B)"を連結する。存在する場合はTag文字列を":"をセパレータに連結する |
分散ロック値 "0"固定 |
Value値 | VersionNo値 getValueVersionCheckで取得した値 |
16 | "true" or "false" or "error" 正しく更新出来た場合は"true".更新出来ない、なんだかの理由により論理的(サイズオーバーなど)に取得できない場合は"false".サーバ側で エラーの場合は"error" |
"OK" or メッセージ 返却第2要素が"true"の場合は"OK"になる."false"や、"error"の場合はメッセージが格納される |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | (B)の場合は× Tagが存在する場合は1Tag単位でエンコード |
× | ○ | × | × | × | ○ | |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例 |
例1更新成功) 16,true,OK 例2更新失敗) 16,false,NG:Data has already been updated |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
incrValue 数値を加算処理を行う。 加算する対象のKey-Valueはあらかじめ登録しておく必要がある。 登録済みのValueが数値ではない Key-Valueセットに実行すると、Valueが0に初期化される。 memcachedの"incr"命令に相当する |
値 | Key値 | 分散ロック値 "0"固定 |
Value値 (数値のみ) |
13 | "true" or "false" 正しく更新出来た場合は"true".更新出来ない、なんだかの理由により論理的(サイズオーバーなど)に更新出来ない場合は"false" |
演算結果or メッセージ 返却第2要素が"true"の場合は加算後の結果数値になる."false"の場合はメッセージが格納される |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | × | ○ | |
|
× | × | ○ | |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例 |
例1更新成功) 13,true,Nw= 例2更新失敗) 13,false,NG |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
decrValue 数値を減算処理を行う。 減算する対象のKey-Valueはあらかじめ登録しておく必要がある。 登録済みのValueが数値ではない Key-Valueセットに実行すると、Valueが0に初期化される。 0よりも小さい値の減算は出来ない。 つまり0に減算を行っても0のままとなる memcachedの"decr"命令に相当する
|
値 | Key値 | 分散ロック値 "0"固定 |
Value値 (数値のみ)
|
|
14 | "true" or "false" 正しく更新出来た場合は"true".更新出来ない、なんだかの理由により論理的(サイズオーバーなど)に更新出来ない場合は"false" |
演算結果or メッセージ 返却第2要素が"true"の場合は加算後の結果数値になる."false"の場合はメッセージが格納される |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | × | ○ | |
|
× | × | ○ | |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例 |
例1更新成功) 14,true,Nw= 例2更新失敗) 14,false,NG |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getMultiValue Keyを複数指定して値を取得 memcachedのgetコマンドにKey値を 複数個並べて一度に取得する 命令(GetMulti)に相当
|
値 | Key値 (カンマ区切りで取得したい Key値を複数指定)
|
22 or "END" |
"true" or "false" 値が取得出来た場合は"true".取得できない、なんだかの理由により論理的(サイズオーバーなど)に取得できない場合は"false" 指定したKey値の順番にValueが 改行区切りで返される。
|
Value値 返却第2要素が"true"の場合はValueになる."false"の場合はこの値はない
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | |
|
|
|
× | × | ○ | |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- |
(特記事項) 上記の返却文字列は1つのKeyとValueのセット単位で改行(LF)区切りで返される つまり改行(LF)区切りでNetworkから読み出し、その単位が送信したKey値の順番に |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例 |
例1) 22,true,dmFsdWUxMA== 22,false, END ※上記は"key12"はデータとして存在しない場合の返却例である。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getTagValues Tagを指定して、そのTagが登録されている、KeyとValueのセットを取得する。 挙動としてはgetMultiValueと非常ににているが、返却される値が、Keyと Valueの連結文字列になっている部分が異なる。
|
値 | Tag値 (複数指定は不可)
|
|
23 or "END"
|
"true"
|
エンコードされたKey値
|
エンコードされたValue値 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | |
|
|
|
× | × | ○ | ○ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-
|
(特記事項) 上記の返却文字列は1つ紐付くのデータ単位で改行(LF)区切りで返される つまり改行(LF)区切りでNetworkから読み出し、その単位デコードを行い処理する。 返却される第3要素はKey値をBase64でエンコードした値となる 返却される第4要素は第3要素のKey値に紐付くValue値をBase64でエンコードした 処理は終了となる。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例
|
例1) 23,true,dGFnc2FtcGxlZGF0YWtleV80,dGFnc2FtcGxlc2F2ZWRhdGFfNA== END
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
removeTagFromKey Tag値とそのTag値に紐付くをKey指定することでTagとの紐付きを削
|
値 | Tag値 | Key値 | 分散ロック値 "0"固定 |
40 |
"true" or "false" or "error" 値が削除出来た場合は"true"。論理的理由指定のKey値とTag値の紐付きが無いなど)に |
返却第2要素が"true"の場合はなし "false"や、"error"の場合はメッセージが格納される |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | ○ | × | |
|
× | × | × | |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例 |
例1値あり) 40,true, 例2値なし) 40,false, 例3Key値サイズオーバー) 40,false,Key Length Error |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setValueAndCreateIndex 値を保存する 保存と同時に全文検索用の検索Indexを 作成する。 作成時の解析方式は、N-Gram 作成するIndexのグルーピィングや、N-GramのNの長さを指定できる。 デフォルトの挙動では1(ユニグラム)、2(バイグラム)、3(トリグラム)文字でインデックスが 作成される。
|
値 | Key値 | Tag値 Tagを指定しない場合は"(B)"を連結する。存在する場合はTag文字列を":"をセパレータに連結する |
分散ロック値 "0"固定 |
Value値 |
ここにかきました。 |
42 |
"true" or "false" or "error" 正常に保存出来た場合は"true".なんだかの理由により論理的(サイズオーバーなど)に保存できない場合は"false".サーバ側でエラーの場合は |
"OK" or メッセージ 返却第2要素が"true"の場合は"OK"になる."false"や、"error"の場合はメッセージが格納される |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encode | ○ | (B)の場合は× Tagが存在する場合は1Tag単位でエンコード |
× | ○ |
ここにかきました。 |
× | × | × | |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
例 |
例1正常保存) 42,true,OK 例2Value値サイズオーバー) 42,false,Value Length Error |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
searchValue 検索したいWordを指定して、setValueAndCreateIndexで登録した Valueに文字検索を行う 検索Indexを限定するグループ指定や、 検索時に検索WordをN-Gram方式で分解 する長さを指定できる。
|
値 | 検索 文字列群 複数指定する場合は文字列を":"をセパレータに連結する
|
複数検索条件の挙動 (AND or OR) "1"=AND "2"=OR
|
検索対象Indexのグルー プ名 グループなし okuyamaプロトコル仕様表okuaymaのオリジナルプロトコルの仕様を表にまとめした。
okuyama-0.8.4リリース、0.8.5のことも。そして次の何か。。また大分さぼってしまった。。 ということで、okuyama-0.8.4をリリースしました。 書くこと一杯。。取り合えずokuyama-0.8.0のことから相当ここをサボってしまいました。 OSC@名古屋に参加してきましたオープンソースカンファレンス@名古屋に参加してきました。 OSC@Kansai-京都無事終了オープンソースカンファレンス@Kansai-京都に参加してきました。 |