memcachedをさわってみた
今月のWEB+DB PRESS にニコニコ動画がどのように負荷分散対策をとってきたかということが詳細に書かれていた。その中にmemcachedというメモリキャッシュシステムが紹介されており、会社の先輩とこれはかなり便利なのではないかという話になった。調べてみた結果、ニコニコ動画はおろか、Wikipedia、mixi、はてな等、トップクラスのトラフィックを誇る世界中のwebアプリケーションで利用されていたことがわかった。
参考:
memcache本家
日本語による詳細な解説
インストールからサーバー構成の例まで盛りだくさん
DBや他のキャッシュシステムと比したときのメリットとしては、
・構築が容易であること
・レスポンスが高速であること(MySQLのメモリキャッシュとのベンチマーク)
・スケールすること
・クライアントAPIが充実していること(Perl、PHP、Ruby、Python、Java、C#....)
こちらの記事を参考に、Macにインストールし、Javaで動かしてみた。
memcachedとlibevent*1のインストールが必要なのだが、いずれも configure 、make 、make install でおしまい。起動もmemcachedコマンド一発。クライアントの実装もシンプルで、memcachedサーバーとの接続も簡単だ。
import java.util.Date; import com.danga.MemCached.*; public class MemcachedTest { public static void main(final String[] args){ //Poolの初期化 //memcacheのデフォルトポート番号は11211 String[] servers = { "localhost:11211" }; SockIOPool pool = SockIOPool.getInstance(); pool.setServers(servers); pool.initialize(); MemCachedClient cache = new MemCachedClient(); //キャッシュクライアントにセット cache.add("String", "test"); cache.add("Date",new Date()); //キャッシュクライアントから取り出す System.out.println(cache.get("String")); System.out.println(cache.get("Date")); System.out.println(cache.get("Hoge")); } }
実行結果:
test
Sat Jan 26 21:22:49 JST 2008
null
用途を考える際に気をつけるべき点としては、設定されたメモリ容量を超えた時点でスワップせずに古いキーから揮発し始めるということ。それが前提だから高速かつ、シンプルで使いやすいということだ。また、当然のことながらアプリケーションサーバーを再起動してもキャッシュは生きている。これはちょっと新鮮な体験だった。
あとは、自分の現在の仕事の中でどのように使えそうか、どれだけのメリットが出るのかを考えたい。データ更新時にリアルタイムに対象のキャッシュのみをクリアする仕組みを作れば、かなり使えるのではないだろうか。少なくともマスタ系のデータに関しては何とかなりそうだ。
また、Windows系OSの利用はあまり前提とされていないので、その辺も調べる必要がある。
*1:libeventについてはまだよくわかっていないので後で調べてみたい。