memcached client for Javaの互換性の無さ
C言語とJava言語のクライアントから,memcachedにアクセスしてみます.
まずはデータのストア.
> env LD_LIBRARY_PATH=. ./Memsetj 127.0.0.1:11211 java_key java_value com.danga.MemCached.MemCachedClient Sun Jan 31 22:01:09 GMT+09:00 2010 - Storing with native handler... com.danga.MemCached.MemCachedClient Sun Jan 31 22:01:09 GMT+09:00 2010 - ++++ memcache cmd (result code): set 127.0.0.1%3A11211 32 0 8 (STORED) com.danga.MemCached.MemCachedClient Sun Jan 31 22:01:09 GMT+09:00 2010 - ++++ data successfully stored for key: 127.0.0.1%3A11211 > ./memsetc 127.0.0.1:11211 c_key c_value
次に,相互に読み出してみます.
> env LD_LIBRARY_PATH=. ./Memgetj 127.0.0.1:11211 java_key com.danga.MemCached.MemCachedClient Sun Jan 31 22:13:26 GMT+09:00 2010 - ++++ retrieving object and stuffing into a string. java_value > env LD_LIBRARY_PATH=. ./Memgetj 127.0.0.1:11211 c_key null > ./memgetc 127.0.0.1:11211 c_key c_value > ./memgetc 127.0.0.1:11211 java_key java_value
Cバージョンのクライアントは,キーがc_keyでもjava_keyでも読み出せました.
しかしJavaバージョンのクライアントは,キーがjava_keyならjava_valueを読み出しましたが,キーがc_keyならnullを返しやがりました.
メモリに格納されている値に問題はありません.
> ./memod 127.0.0.1:11211 ------------------ ITEM #=0 --- KEY c _ k e y 63 5f 6b 65 79 --- VAL c _ v a l u e 63 5f 76 61 6c 75 65 ------------------ ITEM #=1 --- KEY j a v a _ k e y 6a 61 76 61 5f 6b 65 79 --- VAL j a v a _ v a l u e 6a 61 76 61 5f 76 61 6c 75 65
これはすなわち,memcached client for Javaが値の読み出しの時にヘンなことをやってるってことです.
実際,Javaバージョンの読み出しプログラムに一行付け加えるだけで,動作が変わります.
元のプログラム:
import com.danga.MemCached.*; public class Memgetj { public static void main(String[] args) { String[] serverlist = {args[0]}; SockIOPool pool = SockIOPool.getInstance(); pool.setServers(serverlist); pool.initialize(); MemCachedClient memc = new MemCachedClient(); System.out.println(memc.get(args[1])); } }
改良プログラム:
import com.danga.MemCached.*; public class Memgetj { public static void main(String[] args) { String[] serverlist = {args[0]}; SockIOPool pool = SockIOPool.getInstance(); pool.setServers(serverlist); pool.initialize(); MemCachedClient memc = new MemCachedClient(); memc.setPrimitiveAsString(true); System.out.println(memc.get(args[1])); } }
元のプログラムをMemgetj,改良プログラムをMemgetjrawとして実行してみると,次のようになります.
> env LD_LIBRARY_PATH=. ./Memgetj 127.0.0.1:11211 c_key null > env LD_LIBRARY_PATH=. ./Memgetjraw 127.0.0.1:11211 c_key com.danga.MemCached.MemCachedClient Sun Jan 31 22:42:50 GMT+09:00 2010 - ++++ retrieving object and stuffing into a string. c_value
すなわち,他の言語とmemcached client for Javaのプログラムでデータ互換性を持たせたかったら,setPrimitiveAsStringの一行を付け加えましょう.