infinispanメモ

infinispan

簡単に言ってしまえば JBoss で開発されている KVS です。

infinispan で何ができるかは自分自身まだ理解できていないのでそれは他のサイトにお任せするとして、infinispan を軽く動かしてみた際のメモ。

本当に動かしただけなのでクラスタやクエリまではやれてないです。

組み込みで使ってみる

maven プロジェクトを作成して、 infinispan-core を pom.xml に追加します。今回は 7 系が Alpha 版だったので 6.0.2 を使用しました。

DefaultCacheManager manager = new DefaultCacheManager();

まずはマネージャの作成。DefaultCacheManagerをそのまま使うとメモリ上に値が保持されるため、アプリを再起動すると内容がすべて消えるため、値を保持しておきたい場合、以下のようにするとローカルにファイルが保存される。保存する方法も JPA や LevelDB 等が選べるらしい。

DefaultCacheManager manager = new DefaultCacheManager();
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.persistence()
    .addSingleFileStore()
    .location("M:\\cache"); // パスは適当に環境に合わせて

DefaultCacheManager manager = new DefaultCacheManager(builder.build());

これで cache というディレクトリが作成され、中にキャッシュファイルが保存される。

manager.start();

Cache<String, String> cache = manager.getCache();

manager を start させて cache を取得します。ただし、start は manager のコンストラクタ内で呼ばれるっぽいので、コンストラクタに明示的に start を実行しないフラグを渡さない限り省略してもいいかも。

Cache<String, String> cache = manager.getCache("cacheName");

キャッシュに名前を指定可能。

cache.put("key", "value");
System.out.println(cache.get("key"));

後は put と get で OK。~Async というメソッドがあるが、これは組み込みモードでは意味はないらしい(Asyncがついてないメソッドと同じ動きと理解してます)。

cache.put("key", "value", 30, TimeUnit.SECONDS);

TimeUnit で有効期間も指定可能。

manager.stop();

最後に stop。Webアプリに組み込んだ際、きちんと stop を呼ばないとアプリ再デプロイ時に Exception が発生しました(JVM の再起動があれば問題ないかも)。サーブレットなら ServletContextListener でアプリ内で使用した manager の stop を呼べば良い。

サーバを立てて使ってみる(サーバ側)

infinispan のサーバは以下のサイトからダウンロード可能 http://infinispan.org/download/

解凍して bin ディレクトリにある standalone.sh (or bat) が起動スクリプト

./bin/standalone.sh

localhost でサーバを立ち上げるのであればこれでいいのですが、別のサーバ上で実行する場合はバインドする IP を指定する必要があります。

./bin/standalone.sh -b xxx.xxx.xxx.xxx

自身のサーバの IP を指定します。ホスト名でも可能かどうかは未確認。

私の環境では Windows8 が原因なのか CPU 負荷 MAX になってしまうため、別途 Linux サーバを立てて起動したので以降 IP 指定で確認しています。

また、設定ファイルを指定しない場合、./standalone/configuration/standalone.xml の設定ファイルが使用されるようです。

(以下は暫定手順)

<cache-container name="local" default-cache="default" statistics="true">
  ~ 他の設定は省略 ~
 <local-cache name="testCache" start="EAGER"/> <!-- 追加行 -->
</cache-container>

デフォルトのキャッシュ(キャッシュ名指定しない)の場合、うまくデータが登録されてくれなかったため、設定ファイルにキャッシュ名を登録しておきます。

デフォルトの設定ファイルの設定値もきちんと理解しておかなきゃ、、、

サーバを立てて使ってみる(クライアント側)

maven に infinispan-client-hotrod を追加します。

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.addServer().host("xxx.xxx.xxx.xxx").port(11222);

RemoteCacheManager manager = new RemoteCacheManager(builder.build());

ConfigurationBuilder クラスは、組み込みで使ってたクラスとは異なるため注意。

RemoteCache<String, String> cache = manager.getCache("testCache");

cache.put("key", "value");
System.out.println(cache.get("key"));

後は組み込み時と一緒。