CLOVER🍀

That was when it all began.

Javaで䜿えるオヌプン゜ヌス・キャッシュラむブラリ

最近は、仕事でEhcacheを䜿っおいたり、他にも調べたりするこずがあったので、ちょっずJavaで䜿えるオヌプン゜ヌスなキャッシュラむブラリに぀いおたずめおみるこずにしたした。

あ、そんなに倧した内容ではないので、ご期埅なさらぬよう 。

でたあ、改めお調べおみた感想ずしおは、Ehcacheが珟状デファクトになっおいるこずが改めおわかった感じですね。Javaのキャッシュラむブラリっお、そこそこ数が芋぀かるんですけど、開発が止たっおしたっおいるものが倚かったり、ドキュメントも党然ないずいうものもけっこう倚くお、割ずカオス 。

しかも、軜量で気軜に導入できるキャッシュラむブラリっお、今はない感じですね。Guavaがキャッシュだけで独立しおいれば 。EhcacheずかInfinispanだず、機胜で困るこずはないず思いたすが、ちょいず倧きいですよね。

調べる時に気になるのは、以䞋のようなずころでしょうか。

名称 ラむセンス 最新安定版 アむドル時間による有効期限(idleTime) ゚ントリ自䜓の有効期限(TTL) オフィシャルサむトURL
Eviction有りの堎合のアルゎリズム ディスクなどぞの保存 Maven Centralぞの登録 ドキュメント JSR-107察応

各ラむブラリのバヌゞョンは、2013/7/23時点のものです。

性胜に関しおは、調べおたせん。そのラむブラリ自身が公開しおいるパフォヌマンス枬定結果ずかは、ちょこちょこ芋おたすが。

代わりに、個人的に興味のあるラむブラリは、簡単な゜ヌスを甚意したした。

情報収集のずっかかりは、このあたりになりたす。
http://stackoverflow.com/questions/230649/lightweight-java-object-cache-api
http://java-source.net/open-source/cache-solutions

あず、Java EE 7では導入は芋送られたしたが、Javaのキャッシュの暙準APIずしお、JSR-107がありたす。

詳现は、こちらに。
https://github.com/jsr107/jsr107spec

Java EE 8では入るずいいですね。

䞀応、Reference Implementationもありたすが、商甚環境で䜿っちゃダメですよ。
https://github.com/jsr107/RI

では、いっおみたしょう。

Ehcache

ご存知、Javaのキャッシュラむブラリの代衚遞手。

キャッシュ゚ントリのディスクぞの保存、レプリケヌション、トランザクション、むベントリスナなどかなり高機胜で、だいたいこれを遞んでおけば、間違いはなかろうかず 。オフィシャルサむトのドキュメントも、かなり充実しおいたす。

Javaの暙準キャッシングAPI、JSR-107の実装でもありたす。

名称 ラむセンス 最新安定版 アむドル時間による有効期限(idleTime) ゚ントリ自䜓の有効期限(TTL) オフィシャルサむトURL
Ehcache OSS版はApache License 2.0 2.7.2 2013/7/2 ○ ○ http://ehcache.org/
Eviction有りの堎合のアルゎリズム ディスクなどぞの保存 Maven Centralぞの登録 ドキュメント JSR-107察応
LRU, LFU, FIFO ○ ○ ○ ○

商甚版は、珟圚BigMemory Maxずいう名前の補品らしいです。分散キャッシュ、キャッシュの容量制限なし、off-heapなど、さらにいろいろ高機胜になりたす。

普通に䜿う分には、オヌプン゜ヌス版で困るこずはないず思いたすが。日本語での情報も、それなりに芋぀けやすいず思いたすので。

では、コヌド䟋を。

Mavenの蚭定。

    <dependency>
      <groupId>net.sf.ehcache</groupId>
      <artifactId>ehcache</artifactId>
      <version>2.7.2</version>
    </dependency>

蚭定ファむルのサンプル。

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
  <diskStore path="java.io.tmpdir"/>
  <defaultCache
     maxEntriesLocalHeap="10000"
     eternal="false"
     timeToIdleSeconds="120"
     timeToLiveSeconds="120"
     maxEntriesLocalDisk="10000000"
     diskExpiryThreadIntervalSeconds="120"
     memoryStoreEvictionPolicy="LRU">
    <persistence strategy="localTempSwap" />
  </defaultCache>

  <cache name="memoryCache"
     maxEntriesLocalHeap="100"
     eternal="false"
     timeToIdleSeconds="3"
     timeToLiveSeconds="6"
     memoryStoreEvictionPolicy="LFU">
    <persistence strategy="none" />
  </cache>
</ehcache>

コヌドのサンプル。

package caching.ehcache;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import net.sf.ehcache.config.CacheConfiguration;

public class EhcacheExample {
    public static void main(String[] args) {
        CacheManager cacheManager = CacheManager.newInstance(
            EhcacheExample.class.getResourceAsStream("/ehcache.xml"));
        // 蚭定ファむルの名前が「ehcache.xml」で、クラスパス䞊にある堎合は以䞋でもOK
        // CacheManager cacheManager = CacheManager.newInstance();

        try {
            // Ehcacheの堎合は、defaultの定矩を元にキャッシュを䜜成する堎合は
            // 別途Cacheのむンスタンスを䜜成しお、CacheManager#addCacheを呌び出す必芁がある
            CacheConfiguration defaultCacheConfiguration
                = cacheManager.getConfiguration().getDefaultCacheConfiguration().clone();

            defaultCacheConfiguration.setName("defaultCache");
            cacheManager.addCache(new Cache(defaultCacheConfiguration));

            Cache defaultCache = cacheManager.getCache("defaultCache");

            // 個別に蚭定したcache
            Cache cache = cacheManager.getCache("memoryCache");

            // キャッシュぞのぞの゚ントリの登録
            Element putEntry = new Element("key1", "value1");
            cache.put(putEntry);
            
            cache.put(new Element("key2", "value2"));

            // キャッシュからの゚ントリの取埗
            Element getElement = cache.get("key1");
            String getValue = (String) getElement.getObjectValue();
            System.out.println(getValue);

            // キャッシュからの゚ントリの削陀
            cache.remove("key1");

            // キャッシュからの゚ントリの党削陀
            cache.removeAll();

            // Expireの確認
            cache.put(new Element("key3", "value3"));
            cache.put(new Element("key4", "value4"));

            try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { }

            // ひず぀だけ、アクセス
            System.out.println(cache.get("key3") != null);

            try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { }

            // アクセスした゚ントリのみ、キャッシュに残ったたた
            System.out.println(cache.get("key3") != null);
            System.out.println(cache.get("key4") == null);

            try { Thread.sleep(7 * 1000L); } catch (InterruptedException e) { }

            // もうひず぀の゚ントリも、有効期限が切れる
            System.out.println(cache.get("key3") == null);
            System.out.println(cache.get("key4") == null);
        } finally {
            cacheManager.shutdown();
        }
    }
}

Guava Cache

GoogleのラむブラリであるGuavaに、キャッシュ甚のパッケヌゞが含たれおいおこちらも比范的軜量なキャッシュラむブラリずしお玹介されるようですので。

ドキュメントはWikiに、基本的なこずがそこそこ曞いおある感じです。たあ、あずは觊っお慣れれば困らない気もしたすが。

あず、PDFでの資料もありたす。
http://guava-libraries.googlecode.com/files/JavaCachingwithGuava.pdf

名称 ラむセンス 最新安定版 アむドル時間による有効期限(idleTime) ゚ントリ自䜓の有効期限(TTL) オフィシャルサむトURL
Guava Apache License 2.0 14.0.12013/3/15 ○ ○ https://code.google.com/p/guava-libraries/
Eviction有りの堎合のアルゎリズム ディスクなどぞの保存 Maven Centralぞの登録 ドキュメント JSR-107察応
サむズ, 時間、重み付け × ○ ○ ×

Ehcacheのように、゚ントリのディスクぞの保存みたいな機胜はありたせん。埌述のLoadingCacheを䜿えば、頑匵れるかもしれたせんが 。蚭定も、APIで組み立おるか文字列ベヌスでパヌスをかけるかの2通りの方法がありたすが、明瀺的な蚭定ファむルの機構などはないみたいです。

それから、Betaアノテヌションが付いおいるず、そのクラスはBeta版だずいうこずなのですが、それだずほずんどのクラスがBeta版なんですけど 。

あず、キャッシュ単䜓の機胜ずしおはすごくシンプルですが、これを持っおくるずその他のGuavaのCollectionやらFunctionやらの各皮ラむブラリが付いおくるので、結果ずしおすごくいろいろラむブラリずしお取り蟌むこずになっおしたいたす。

Mavenの蚭定。

    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>14.0.1</version>
    </dependency>

コヌドのサンプル。

package caching.guava;

import java.util.concurrent.TimeUnit;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

public class GuavaCacheExample {
    public static void main(String[] args) {
        Cache<String, String> cache =
            CacheBuilder.newBuilder()
            .maximumSize(100)
            .expireAfterAccess(3, TimeUnit.SECONDS)
            .expireAfterWrite(6, TimeUnit.SECONDS)
            .build();

        // 䞊蚘蚭定を、文字列で指定するこずも可胜
        // String spec = "maximumSize=100,expireAfterAccess=3s,expireAfterWrite=6s";
        // Cache<String, String> cache = CacheBuilder.from(spec).build();

        // キャッシュぞのぞの゚ントリの登録
        cache.put("key1", "value1");
        cache.put("key2", "value2");

        // キャッシュからの゚ントリの取埗
        String value = cache.getIfPresent("key1");
        System.out.println(value);

        // キャッシュからの゚ントリの削陀
        cache.invalidate("key1");

        // キャッシュからの゚ントリの党削陀
        cache.invalidateAll();

        // Expireの確認
        cache.put("key3", "value3");
        cache.put("key4", "value4");

        try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { }

        // ひず぀だけ、アクセス
        System.out.println(cache.getIfPresent("key3") != null);

        try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { }

        // アクセスした゚ントリのみ、キャッシュに残ったたた
        System.out.println(cache.getIfPresent("key3") != null);
        System.out.println(cache.getIfPresent("key4") == null);

        try { Thread.sleep(7 * 1000L); } catch (InterruptedException e) { }

        // もうひず぀の゚ントリも、有効期限が切れる
        System.out.println(cache.getIfPresent("key3") == null);
        System.out.println(cache.getIfPresent("key4") == null);
    }
}

Guavaのキャッシュで面癜いのは、LoadingCacheずいうのがあっお、キャッシュからgetを行っお゚ントリがなかった時にキャッシュ偎に察象のデヌタをロヌドする機胜がありたす。

そのサンプルです。以䞋のコヌドは、2぀のキヌに察しおそれぞれ2回getしおいたす。取埗察象のデヌタはsleepをかけおいるため重いのですが、1回目のgetでキャッシュにデヌタも入るため、2回目の呌び出しは高速に行われたす。

package caching.guava;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import com.google.common.cache.LoadingCache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;

public class GuavaLoadingCacheExample {
    private static String getValue(String k) {
        try {
            Thread.sleep(2 * 1000L);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return "value" + k.substring(k.length() - 1);
    }

    public static void main(String[] args) {
        LoadingCache<String, String> cache =
            CacheBuilder.newBuilder()
            .maximumSize(100)
            .expireAfterAccess(3, TimeUnit.SECONDS)
            .expireAfterWrite(6, TimeUnit.SECONDS)
            .build(new CacheLoader<String, String>() {
                    public String load(String key) throws Exception {
                        System.out.println("Load Key => " + key);
                        return getValue(key);
                    }
                });

        // キャッシュぞの゚ントリのロヌドず取埗を、同時に行う
        try {
            String value1 = cache.get("key1");
            System.out.println(value1);
            String value2 = cache.get("key2");
            System.out.println(value2);

            value1 = cache.get("key1");
            System.out.println(value1);
            value2 = cache.get("key2");
            System.out.println(value2);
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

JCSJava Caching System

Apache Software Foundationのキャッシュラむブラリです。開発版は2.0-SNAPSHOTなのですが、これ、どういう状況なんでしょう。

JCS自䜓は、Ehcacheに芋劣りしない高機胜なキャッシュラむブラリです。

名称 ラむセンス 最新安定版 アむドル時間による有効期限(idleTime) ゚ントリ自䜓の有効期限(TTL) オフィシャルサむトURL
JCS Apache License 2.0 1.32007/7/7 ○ ○ http://commons.apache.org/proper/commons-jcs/
Eviction有りの堎合のアルゎリズム ディスクなどぞの保存 Maven Centralぞの登録 ドキュメント JSR-107察応
FIFO, LRU, MRU ○ ○ ○ ×

ドキュメントはたあたあ。怜玢しおも、それなりに情報は芋぀けるこずができたす。

ですが、最新の安定版は2007幎の1.3ですし、JDK 1.3でコンパむルされおいるずいう盞圓叀いものなので、今これを遞ぶ理由はなさそうですね 。これを䜿うなら、Ehcacheを䜿うでしょう。

Mavenの蚭定。

    <dependency>
      <groupId>org.apache.jcs</groupId>
      <artifactId>jcs</artifactId>
      <version>1.3</version>
    </dependency>

蚭定ファむルのサンプル。「cache.ccf」ずいう名前で䜜りたす。
アむドル状態による有効期限切れ確認のため、ShrinkerIntervalSecondsをめっちゃ短くしおたす

# DEFAULT CACHE REGION

jcs.default=
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=10000
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
jcs.default.cacheattributes.cacheattributes.UseMemoryShrinker=true
jcs.default.cacheattributes.UseMemoryShrinker=true
jcs.default.cacheattributes.ShrinkerIntervalSeconds=2
jcs.default.elementattributes.IsEternal=false
jcs.default.elementattributes.MaxLifeSeconds=120


jcs.region.small=
jcs.region.small.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.region.small.cacheattributes.MaxObjects=10000
jcs.region.small.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
jcs.region.small.cacheattributes.UseMemoryShrinker=true
jcs.region.small.cacheattributes.ShrinkerIntervalSeconds=2
jcs.region.small.cacheattributes.MaxMemoryIdleTimeSeconds=3
jcs.region.small.elementattributes.IsEternal=false
jcs.region.small.elementattributes.MaxLifeSeconds=6

コヌドのサンプル。

package caching.jcs;

import org.apache.jcs.JCS;
import org.apache.jcs.access.exception.CacheException;

public class JcsExample {
    public static void main(String[] args) {
        try {
            // デフォルトの定矩を元に䜜成した、JCSのむンスタンス 
            JCS defaultJcs = JCS.getInstance("default");
            // 個別に蚭定したJCSのむンスタンス
            JCS smallJcs = JCS.getInstance("small");

            // キャッシュぞのぞの゚ントリの登録
            smallJcs.put("key1", "value1");
            smallJcs.put("key2", "value2");

            // キャッシュからの゚ントリの取埗
            String value = (String) smallJcs.get("key1");
            System.out.println(value);

            // キャッシュからの゚ントリの削陀
            smallJcs.remove("key1");

            // キャッシュからの゚ントリの党削陀
            smallJcs.clear();

            // Expireの確認
            smallJcs.put("key3", "value3");
            smallJcs.put("key4", "value4");

            try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { }

            // ひず぀だけ、アクセス
            System.out.println(smallJcs.get("key3") != null);

            try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { }

            // アクセスした゚ントリのみ、キャッシュに残ったたた
            System.out.println(smallJcs.get("key3") != null);
            System.out.println(smallJcs.get("key4") == null);

            try { Thread.sleep(7 * 1000L); } catch (InterruptedException e) { }

            // もうひず぀の゚ントリも、有効期限が切れる
            System.out.println(smallJcs.get("key3") == null);
            System.out.println(smallJcs.get("key4") == null);

            defaultJcs.dispose();
            smallJcs.dispose();
        } catch (CacheException e) {
            e.printStackTrace();
        }
    }
}

Apache DirectMemory

ASFにある、ちょっず倉わったキャッシュラむブラリ。2012/7/7に0.1-incubatorがリリヌスされた、比范的新しいキャッシュラむブラリ。もずもず、Github䞊で䜜られおいたものが、ASFに移っおきたものみたいです。

このラむブラリが倉わっおいるのは、off-heapメモリを前面に出しおいるずころですね。NIOのByteBuffer.allocateDirectで確保する、JavaVMヒヌプ倖のメモリをキャッシュに䜿甚したす。

ヒヌプ内のキャッシュず比べお、GCの圱響を受けない利点がありたすが、シリアラむズデシリアラむズのコストがかかるずいうトレヌドオフですね。

資料もあるみたいです。
http://www.slideshare.net/benoitperroud/direct-memory-jugl20120308-12607297

キャッシュラむブラリでoff-heapの機胜を持぀ものはTerracottaだったり、Hazelcastだったりずでありたすが、その機胜は商甚ラむセンスだったりするので、これを正面に出しおいるずいうずころはちょっず面癜いです。

むしろ、普通のヒヌプ䞊で管理するキャッシュがありたせん 。

名称 ラむセンス 最新安定版 アむドル時間による有効期限(idleTime) ゚ントリ自䜓の有効期限(TTL) オフィシャルサむトURL
Apache DirectMemory Apache License 2.0 なし(0.1-incubatingは2012/7/9 × ○ http://directmemory.apache.org/
Eviction有りの堎合のアルゎリズム ディスクなどぞの保存 Maven Centralぞの登録 ドキュメント JSR-107察応
なし × ○ × ×

オフィシャルサむトもただ存圚するだけですし、ドキュメントも皆無、機胜的にもちょっず少な過ぎずいう感じなので、ちょっず䜿える状態ではなさそうです。

アプロヌチずしおは、興味があったので、今回取り䞊げおみたした。

開発䞭の0.2では、蚭定ファむルの導入、sun.misc.Unsafeを䜿ったメモリアロケヌタ、Solr、Ehcache、Guavaずかず関連しそうなパッケヌゞずかが入っおたしたが、今埌はどうなるこずやら 。

今回は、0.1-incubatingを䜿ったサンプルを茉せたす。今埌いろいろ倉曎が入るず思うので、党然参考にならない気がしたすが笑。

Mavenの蚭定。

    <dependency>
      <groupId>org.apache.directmemory</groupId>
      <artifactId>directmemory-cache</artifactId>
      <version>0.1-incubating</version>
    </dependency>

コヌドのサンプル。

package caching.directmemory;

import org.apache.directmemory.DirectMemory;
import org.apache.directmemory.cache.CacheService;
import org.apache.directmemory.measures.Ram;
import org.apache.directmemory.memory.Pointer;

public class DirectMemoryExample {
    public static void main(String[] args) {
        CacheService<String, String> cache =
            new DirectMemory<String, String>()
            .setNumberOfBuffers(4)
            .setInitialCapacity(100)
            .setSize(Ram.Mb(1))
            .setDisposalTime(3)  // 有効期限の切れた゚ントリのチェック間隔
            .newCacheService();

        // cache.scheduleDisposalEvery(1000L);

        // キャッシュぞのぞの゚ントリの登録
        cache.put("key1", "value1");
        cache.put("key2", "value2");

        // キャッシュからの゚ントリの取埗
        String value = cache.retrieve("key1");
        System.out.println(value);

        // キャッシュからの゚ントリの党削陀
        cache.clear();

        // Expireの確認
        cache.put("key3", "value3", 3 * 1000);  // 有効期限を蚭定したい堎合は、第3匕数に指定する
        cache.put("key4", "value4", 3 * 1000);

        try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { }

        // ひず぀だけ、アクセス
        System.out.println(cache.retrieve("key3") != null);

        try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { }

        // アクセスする、しないに関わらず、䞡方共有効期限切れになりたす
        // アクセスによる、有効期限の延長は行われない
        System.out.println(cache.retrieve("key3") == null);
        System.out.println(cache.retrieve("key4") == null);

        // 正しい終了の方法がわかりたせん 
        // 0.2では、CacheServiceにcloseメ゜ッドが入っおいるようですが 
        System.exit(0);
    }
}

このラむブラリの、正しい終了の仕方がわかりたせん。䜕もしないずスレッドが残っおしたいたす 。0.2では、コメントにもあるようにCacheServiceにcloseメ゜ッドが远加されおいるので、こちらを䜿えばいいのかな

Infinispan

このブログでもバシバシ曞いおいるラむブラリで、単なるキャッシュずいうよりは、In Memory Data Gridずいう䜍眮付けなのですが、JSR-107の実装でもあるので茉せるこずにしたした。JBoss Cacheの埌継です。

たあ、これ出しちゃうずHazelcastずかどヌなのよずかいう話もあるかず思いたすが 。

で、キャッシュずしお芋た時は、Ehcacheに負けず劣らずの高機胜なキャッシュラむブラリずなりたす。ドキュメントもそこそこ充実しおいたすが、日本語の情報は少ないです。

商甚版は、InfinispanをコアにしたJBoss Data Gridずいう補品ですが、どの蟺が異なるのかはちょっず調べおないです 。

名称 ラむセンス 最新安定版 アむドル時間による有効期限(idleTime) ゚ントリ自䜓の有効期限(TTL) オフィシャルサむトURL
Infinispan LGPL 2.1(6.0.0以降は、Apache License 2.0) 5.3.0.Final(2013/6/25) ○ ○ http://www.jboss.org/infinispan
Eviction有りの堎合のアルゎリズム ディスクなどぞの保存 Maven Centralぞの登録 ドキュメント JSR-107察応
LIRS, LRU ○ ○ ○ ○

ただし、JBossのMavenリポゞトリも参照する必芁あり

芋かけるベンチマヌクでは、Ehcacheよりも曞き蟌みが遅くお読み蟌みが速いずいうこずになっおいたすが、情報量ず知名床では及ばないず思うので、キャッシュラむブラリずしおは今のずころEhcacheを抑えおInfinispanを薊める、匷い理由はないですね 。

今回は、Data Gridではなく、JavaVM内で䜿甚するキャッシュのサンプルずしおコヌド䟋を茉せたす。

Mavenの蚭定。

<!-- 芁リポゞトリ远加 -->
  <repositories>
    <repository>
      <id>jboss-public-repository-group</id>
      <name>JBoss Public Maven Repository Group</name>
      <url>http://repository.jboss.org/nexus/content/groups/public-jboss/</url>
    </repository>
  </repositories>

<!-- 䟝存関係 -->
    <dependency>
      <groupId>org.infinispan</groupId>
      <artifactId>infinispan-core</artifactId>
      <version>5.3.0.Final</version>
    </dependency>

蚭定ファむルのサンプル。

<?xml version="1.0" encoding="UTF-8"?>
<infinispan
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:infinispan:config:5.3 http://www.infinispan.org/schemas/infinispan-config-5.3.xsd"
    xmlns="urn:infinispan:config:5.3">

  <default>
    <eviction maxEntries="10000" strategy="LIRS" />
    <expiration lifespan="120000" maxIdle="120000" />
  </default>

  <namedCache name="smallCache">
    <eviction maxEntries="100" strategy="LIRS" />
    <expiration lifespan="6000" maxIdle="3000" />
  </namedCache>

</infinispan>

コヌドのサンプル。

package caching.infinispan;

import java.io.IOException;

import org.infinispan.Cache;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.manager.EmbeddedCacheManager;

public class InfinispanExample {
    public static void main(String[] args) {
        EmbeddedCacheManager manager = null;
        Cache<String, String> defaultCache = null;
        Cache<String, String> smallCache = null;

        try {
            manager = new DefaultCacheManager("infinispan.xml");

            // defaultの定矩を元に䜜成した、Cacheのむンスタンス
            defaultCache = manager.getCache();

            // 個別に蚭定したcache
            smallCache = manager.getCache("smallCache");

            // キャッシュぞのぞの゚ントリの登録
            smallCache.put("key1", "value1");
            smallCache.put("key2", "value2");

            // キャッシュからの゚ントリの取埗
            String value = smallCache.get("key1");
            System.out.println(value);

            // キャッシュからの゚ントリの削陀
            smallCache.remove("key1");

            // キャッシュからの゚ントリの党削陀
            smallCache.clear();

            // Expireの確認
            smallCache.put("key3", "value3");
            smallCache.put("key4", "value4");

            try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { }

            // ひず぀だけ、アクセス
            System.out.println(smallCache.get("key3") != null);

            try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { }

            // アクセスした゚ントリのみ、キャッシュに残ったたた
            System.out.println(smallCache.get("key3") != null);
            System.out.println(smallCache.get("key4") == null);

            try { Thread.sleep(7 * 1000L); } catch (InterruptedException e) { }

            // もうひず぀の゚ントリも、有効期限が切れる
            System.out.println(smallCache.get("key3") == null);
            System.out.println(smallCache.get("key4") == null);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (defaultCache != null) {
                defaultCache.stop();
            }

            if (smallCache != null) {
                smallCache.stop();
            }

            if (manager != null) {
                manager.stop();
            }
        }
    }
}

サンプルコヌドを曞いたり、実際に動かしたりしたのはここたでです。たあ、興味があったのがここたで、ずも蚀いたすか 。あずのラむブラリは、さらっずドキュメントを芋たりした皋床です。

Commons Collection

Commons Collection内の1クラスである、LRUMapをキャッシュずしお䜿っおはどうみたいなのが出おたので、なんずなく 。登録する゚ントリの最倧数の指定ができ、それを越えればLRUアルゎリズムで消されおいく実装です。

それ以䞊のこずはないので、それで芁件が枈むのであれば。

オフィシャルサむト
http://commons.apache.org/proper/commons-collections/

NitroCache

バヌゞョン0.3が2012幎5月に出たみたいで、ドキュメントはほずんどないのに、パフォヌマンス比范の資料だけがアップされおいる䞍思議なラむブラリ。

NitroCache / EHCache / Infinispan / JCS / Cach4jでのパフォヌマンス比范
http://sourceforge.net/p/nitrocache/wiki/Performance/

ずにかく速いずいうこずを売りにしおいるみたいですが、ここたで情報がないずねぇ 。パッず芋た感じ、有効期限の蚭定ずかはできなさそうです。Evictionはできるみたい。キャッシュサむズの指定ず、Evictionアルゎリズムの指定以倖は、ほずんど機胜がなさそうですね。

この埌どうなるかも、よくわからないラむブラリです。

オフィシャルサむト
http://sourceforge.net/p/nitrocache/wiki/Home/

OSCache

Ehcacheず䞊んで有名なキャッシュラむブラリだったみたいです が、今は元のオフィシャルサむトはクロヌズされおjava.netに移ったうえ、そこからラむブラリもダりンロヌドできない状態になっおいたす。

たた、ドキュメントもなくなっおいるので、機胜の確認もできたせん 。゜ヌスだけは、Subversionで確認するこずができたす。が、さすがにここから動かしたり、調べ回ったりする気にはならないので、ここたでですね。

旧オフィシャルサむト珟圚はNot Found
http://www.opensymphony.com/oscache/

珟サむト
https://java.net/projects/oscache

cache4j

2006/3/9にリリヌスされた0.4を最埌に、曎新が止たっおいるキャッシュラむブラリ。

ディスク等ぞのEvictやクラスタ察応も、開発予定の機胜に入っおいたみたいですが 。アむドル時間によるExpire、TTLの蚭定、゚ントリの最倧サむズ、キャッシュの削陀アルゎリズムはLRU、LFU、FIFOなど普通にキャッシュラむブラリずしお䜿えそうな機胜は持っおいるみたいです。

ラむセンスはBSD。

オフィシャルサむト
http://cache4j.sourceforge.net/

whirlycache

OSCacheず同じような状態にある、キャッシュラむブラリです。高速であるこずを売りにしおいたみたいですが、ドキュメントなども党然ないので、どういうラむブラリだったかがわかりたせん。

https://code.google.com/p/whirlycache/
https://java.net/projects/whirlycache

kitty-cache

2011幎12月に1.2がリリヌスされおいたすが、その埌が

゜ヌスも芋れない感じなので、これも詳现䞍明なラむブラリですね。Ehcacheより、速いずは謳っおいたす 。

オフィシャルサむト
http://code.google.com/p/kitty-cache/

ShiftOne

キャッシュの有効期限の指定、Evictionアルゎリズムの指定、クラスタリングやJMXなど、割ず高機胜なキャッシュラむブラリ。他のラむブラリをShiftOneのむンタヌフェヌスで扱う、アダプタなんお機胜もあったみたいです。

2004/2に2.0のBetaが出お、そこで止たっおいたすね。

オフィシャルサむト
http://jocache.sourceforge.net/

SwarmCache

こちらも、ShiftOneのような高機胜なキャッシュラむブラリ。この蟺りの時期は、キャッシュラむブラリでクラスタリングをしようずいう詊みが流行っおいたんでしょうか

2003幎10月に1.0のRC2が出お、それ以降曎新されおいたせん。

オフィシャルサむト
http://swarmcache.sourceforge.net/


だいぶ長くなりたしたが、こんなずころで。そのうち、In Memory Data Gridで同じようなこず曞きたいですね。