JavaでキャッシュをMap、memcached、ejb3とかで

Javaでナイスな感じのキャッシュの仕組みがほしい。

  • 同一アプリサーバー内の複数のWebアプリでキャッシュを共有したい。
  • ほとんどパフォーマンスを落とさないならクラスタ間でもキャッシュ共有したいけど、とりあえずクラスタ間の共有はなくてもよい。
  • できればアプリサーバーはTomcat

で、探す。

(イントロダクション読んで)なんとなく却下。まったく試してない。

サンプル試したりしたけど、なんかスケールがでかすぎる。たかがキャッシュごときに。却下。時間ある時にきちんと勉強してみたい。

思ったより全然パフォーマンスいい感じなので、候補。


ここで、
Ejb3でキャッシュの仕組みを作ったらどうだろ?と思った。

で、試してみる事にした。

Local参照なら超ハイパフォーマンスなアプリ間キャッシュできるかもなーと期待して、作ってみる。
TomcatなのでEasyBeansを使って動かす事にする。

で、できた。

動かしてみる。
簡単な測定をしてみるとHashMapと比較して、2桁nano秒遅い。
memcachedより、1桁nano秒遅い。

意外な結果だと思ってたら、Remoteインターフェースだった事に気がつく。
ローカルインターフェースに修正する事にする。

で、直った。

動かしてみる。
エラー。


エラーメッセージが意味不明。


ググる


たぶん「ejb3のローカル参照って同じear内でしか参照できない(←たぶん)」って事という結論に至る。
前にJBossejb3のローカル参照やった時は同一サーバー内のアプリからローカル参照使えたからそれが普通だと思っていたけど、多分Jbossだけなんだろう。
UCLだったかなんかそんなんが関係してくるのかなー。
と思いながら、面倒くさいのでどうでも良しとする。


でも、やっぱりローカル参照のパフォーマンスを試したい。

で、JBossで試す事にする。

動かしてみた。
超速い。
てか、HashMapとほとんど変わらない。
JBoss上だと、なぜかHashMapが結構遅くなっているのが気になるけど。
それでも、ローカル参照のキャッシュは超速い。

どっちにしても、いろいろあってJBossは選択肢から外す。却下。

で、memcachedで決まりかなーと思い始める。

もう一回測定してみる事にする。

で、気がつく

データが小さい時はパフォーマンス良いけど、データが大きくなってくるとパフォーマンスが落ちてくる。
Ejb3(リモート)だとそんなに変化ない。

データがそこそこ大きくなると、memcachedの方がejb3よりも遅くなっている。


考える。

で、GZIP圧縮ってのに気がつく。

試す。

MemCachedClient mc = new MemCachedClient();
mc.setCompressEnable(true);
mc.setCompressThreshold(64 * 1024);

動かす。

速くなった。
データがそこそこ大きくなってもejb3(リモート)より全然速い。

で、決めた。

memcachedにする。

memcachedはほかにもいろいろ設定あるからチューニングしたらもっと速くなるかな。
こんどクラスタ間での共有時のパフォーマンスも試してみたい。