すいません。インストールしてからずいぶん間が空いてしまいましたね。。。
いやいや、というのもですね。
業務上で必要になるからってmemcached勉強しようと思ったのに、結局業務で使ってるのRedisなんですもん。
はい。すいません。ただの言い訳です。
とりあえずjavaから使ってみますね。
使うライブラリはこれ。
Memcached-Java-Client
ここからダウンロードするのがお手軽です。現時点での最新版は2.6.6。
https://github.com/gwhalin/Memcached-Java-Client/downloads
適当に新規プロジェクト作成。上記のzipを展開して出てきたjarをプロジェクトに全部つっこむ。
そしておもむろにHOWTOに載ってるソースをコピー&ペースト…!
ちょちょっと修正。
- staticブロックの変数serversの値を"localhost:11211"に変更。
- mcc.setCompressEnableとmcc.setCompressThresholdをコメントアウト。
- staticメソッドexamplesの名前をmainに変更。
- barの結果を出力するsysoを追加。
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
public class MemcachedTest {
// create a static client as most installs only need
// a single instance
protected static MemCachedClient mcc = new MemCachedClient();
// set up connection pool once at class load
static {
// server list and weights
String[] servers = {
"localhost:11211"
};
Integer[] weights = { 3 };
// grab an instance of our connection pool
SockIOPool pool = SockIOPool.getInstance();
// set the servers and the weights
pool.setServers( servers );
pool.setWeights( weights );
// set some basic pool settings
// 5 initial, 5 min, and 250 max conns
// and set the max idle time for a conn
// to 6 hours
pool.setInitConn( 5 );
pool.setMinConn( 5 );
pool.setMaxConn( 250 );
pool.setMaxIdle( 1000 * 60 * 60 * 6 );
// set the sleep for the maint thread
// it will wake up every x seconds and
// maintain the pool size
pool.setMaintSleep( 30 );
// set some TCP settings
// disable nagle
// set the read timeout to 3 secs
// and don't set a connect timeout
pool.setNagle( false );
pool.setSocketTO( 3000 );
pool.setSocketConnectTO( 0 );
// initialize the connection pool
pool.initialize();
// lets set some compression on for the client
// compress anything larger than 64k
// mcc.setCompressEnable( true );
// mcc.setCompressThreshold( 64 * 1024 );
}
// from here on down, you can call any of the client calls
public static void main(String[] args) {
mcc.set( "foo", "This is a test String" );
String bar = (String) mcc.get( "foo" );
System.out.println(bar);
}
}
んでデバッグ実行。
This is a test String
が表示されれば成功っす。
MemCachedClientを使う前にSockIOPoolを(一度だけ)初期化すれば良いってことっすね。
SockIOPoolってのは名前からしてMemCachedClientの内部で使用してるオブジェクトプールかと(commons-poolつかってるしね)。なので、MemCachedClientをガンガン呼んでもSockIOPoolがいい感じに処理してくれるということです。たぶん。
SockIOPoolの設定は設定ファイルに持たせたくなるけど、SockIOPoolのメソッドを見た感じでは見当たらなかったので、必要なら各自作るって感じかな?
逆に初期設定で良いなら(普通は良くないだろうけどw)、これでも動く。
public class MemcachedTest {
public static void main(String[] args) {
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(new String[]{"localhost:11211"});
pool.initialize();
MemCachedClient mcc = new MemCachedClient();
mcc.set( "foo", "This is a test String" );
String bar = (String) mcc.get( "foo" );
System.out.println(bar);
}
}
お手軽っすね。
あとはキャッシュとして使うだけ!
イメージ的にはこんな感じ。
class XxxDao{
List<XxxDto> getHoge(String id){
// キャッシュから探す
List<XxxDto> retval = memcached.get("XxxDao.getHoge:"+id);
if(retval == null){
// DBから取得する
retval = DB.getHoge(id);
// キャッシュに保存する
if(retval != null){
memcached.set("XxxDao.getHoge:"+id, retval);
}
}
return retval;
}
}
Enjoy! (←これで締めるのカッコイイよね!!)