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の一行を付け加えましょう.