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)