memcached はメモリ上にオブジェクトを保持しておくことが可能なデーモン(daemon)。
要するに、オブジェクトキャッシュサーバ。

memcached: a distributed memory object caching system

Debian GNU/Linux Sarge へインストールする

memcached という Debian パッケージが用意されている。


# apt-get install memcached // インストール
# dpkg -l | grep memcached // バージョン確認
ii  memcached      1.1.12-1       A high-performance memory object caching sys
# vi /etc/memcached.conf // 設定ファイル書き換え(書き換え不要!)
# /etc/init.d/memcached restart // デーモン再起動

Java から memcached へアクセスするサンプルソースコード

memcached java client から java memcached client 1.5 をダウンロードして使う。
memcached の最新バージョンは 1.2.0
Debian パッケージでのバージョンは 1.1.12
バージョンの問題が出ないといいな。


$ cat ./Mcs.java
import java.util.*;
import com.danga.MemCached.*;
 
public class Mcs{
 
        public static void main(String[] args){
 
                // SockIOPool を初期化
                String[] serverlist = { "localhost:11211" };
                SockIOPool pool = SockIOPool.getInstance();
                pool.setServers(serverlist);
                pool.initialize();
 
                // memcached にオブジェクトを追加
                {
                        MemCachedClient mc = new MemCachedClient();
                        String key   = "testkey1";
                        Test1 value  = new Test1();
                        if(mc.set(key, value)){
                                System.out.println("set ok");
                        }else{
                                System.out.println("set ng");
                        }
                }
 
                // memcached からオブジェクトを取り出す
                {
                        MemCachedClient mc = new MemCachedClient();
                        String key   = "testkey1";
                        Test1 value  = (Test1)mc.get(key);
                        System.out.println(value.a);
                        System.out.println(value.b);
                        System.out.println(value.c);
                        System.out.println(value.d.date);
                }
 
        }
 
        // 直列化と直列化復元の際に特殊な扱いが必要なクラスでは、
        // private void writeObject(java.io.ObjectOutputStream out) throws IOException
        // private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
        // を実装すること!
        // ・・・特殊じゃないからとりあえず implements Serializable するだけ
        public static class Test1 implements Serializable {
                public int    a = 1;
                public double b = 3.14;
                public String c = "ほげー";
                public Test2  d = new Test2();
        }
 
        // ・・・特殊じゃないからとりあえず implements Serializable するだけ
        public static class Test2 implements Serializable {
                public Date date = new Date();
        }
 
}
$ javac -cp ./java_memcached-release_1.5.jar Mcs.java
$ ls
Mcs$Test1.class  Mcs$Test2.class  Mcs.class  Mcs.java  java_memcached-release_1.5.jar

失敗1: SockIOPool を初期化するコードを書き忘れた場合


$ java -cp ./java_memcached-release_1.5.jar:. Mcs
com.danga.MemCached.SockIOPool Tue Dec 19 21:48:06 JST 2006 - attempting to get SockIO from uninitialized pool!
set ng
com.danga.MemCached.SockIOPool Tue Dec 19 21:48:06 JST 2006 - attempting to get SockIO from uninitialized pool!
Exception in thread "main" java.lang.NullPointerException
        at Mcs.main(Mcs.java:23)

失敗2: やっぱり Serializable インターフェースを実装しなかった場合


$ java -cp ./java_memcached-release_1.5.jar:. Mcs
com.danga.MemCached.MemCachedClient Tue Dec 19 21:52:59 JST 2006 - ++++ serializing for key: testkey1 for class: Mcs$Test1
com.danga.MemCached.MemCachedClient Tue Dec 19 21:52:59 JST 2006 - failed to serialize obj
java.io.NotSerializableException: Mcs$Test1
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291)
        at com.danga.MemCached.MemCachedClient.set(MemCachedClient.java:649)
        at com.danga.MemCached.MemCachedClient.set(MemCachedClient.java:423)
        at Mcs.main(Mcs.java:17)
com.danga.MemCached.MemCachedClient Tue Dec 19 21:52:59 JST 2006 - Mcs$Test1@12b3374
set ng
Exception in thread "main" java.lang.NullPointerException
        at Mcs.main(Mcs.java:28)

成功


$ java -cp ./java_memcached-release_1.5.jar:. Mcs
com.danga.MemCached.MemCachedClient Tue Dec 19 21:56:57 JST 2006 - ++++ serializing for key: testkey1 for class: Mcs$Test1
com.danga.MemCached.MemCachedClient Tue Dec 19 21:56:57 JST 2006 - ++++ memcache cmd (result code): set testkey1 8 0 199
 (STORED)
com.danga.MemCached.MemCachedClient Tue Dec 19 21:56:57 JST 2006 - ++++ data successfully stored for key: testkey1
set ok
com.danga.MemCached.MemCachedClient Tue Dec 19 21:56:57 JST 2006 - ++++ deserializing class Mcs$Test1
1
3.14
ほげー
Tue Dec 19 21:56:57 JST 2006

メモリからあふれたら、ファイルやDBにキャッシュしてくれる機能もあるといいのになぁ

探してたら JBoss Cache というのをみつけた。
これは、ファイルにキャッシュしてくれそう。

日本語チュートリアルもあるっぽい ⇒ JBoss Cache as a POJO 日本語訳:1.イントロダクション

でも、なんだか難しそう (´・ω・`) API 見たけどよくわからない。パス。

tags: zlashdot Java Debian Java

Posted by NI-Lab. (@nilab)