web-dev-qa-db-ja.com

軽量JavaオブジェクトキャッシュAPI

質問

JavaインメモリオブジェクトキャッシングAPI。探しているものはありますか。

現在

今、私はただ地図を使用しています:

Map cache = new HashMap<String, Object>();
cache.put("key", value);

必要条件

キャッシュを拡張して、次のような基本機能を含める必要があります。

  • 最大サイズ
  • 有効期間

ただし、次のような高度な機能は必要ありません。

  • 複数のプロセスからのアクセス(キャッシュサーバー)
  • 永続性(ディスクへ)

提案

インメモリキャッシング:

  • Guava CacheBuilder-アクティブな開発。これを参照してください presentation
  • LRUMap -API経由の設定。 TTLはありません。キャッシング専用ではありません。
  • whirlycache -XML設定。メーリングリスト。最終更新2006.
  • cache4j -XML設定。ロシア語のドキュメント。最終更新2006.

エンタープライズキャッシング:

  • [〜#〜] jcs [〜#〜] -プロパティ設定。豊富なドキュメント。
  • Ehcache -XML設定。豊富なドキュメント。 Googleのヒットによると、断然最も人気があります。
96
Chase Seibert

EHCache はとてもいいです。メモリ内キャッシュを作成できます。メモリキャッシュを作成する例については、 コードサンプル をご覧ください。最大サイズと有効期間を指定できます。

EHCacheはいくつかの高度な機能を提供しますが、それらの使用に興味がない場合は提供しないでください。ただし、要件が変更された場合にそれらが存在することを知ってうれしいです。

これはメモリ内キャッシュです。コードで作成され、構成ファイルはありません。

CacheManager cacheManager = CacheManager.getInstance();
int oneDay = 24 * 60 * 60;
Cache memoryOnlyCache = new Cache("name", 200, false, false, oneDay, oneDay);
cacheManager.addCache(memoryOnlyCache);

200個の要素を保持し、ttlが24時間のキャッシュを作成します。

55
Steve K

MapMaker がとても気に入っています Google Guava (- [〜#〜] api [〜#〜]

JavaDocには、その使いやすさとパワーの両方を示す非常にきちんとした例があります。

ConcurrentMap<Key, Graph> graphs = new MapMaker()
   .concurrencyLevel(32)
   .softKeys()
   .weakValues()
   .expiration(30, TimeUnit.MINUTES)
   .makeComputingMap(
       new Function<Key, Graph>() {
         public Graph apply(Key key) {
           return createExpensiveGraph(key);
         }
       });

さらに、Guavaのリリース10.0では、はるかに広範な com.google.common.cacheパッケージ

43
Joachim Sauer

グアバの MapMaker は、 CacheBuilder クラスに置き換えられました。

9
Bohemian

KittyCacheと呼ばれる私の小さなキャッシュライブラリをチェックアウトすることもできます。

https://github.com/treeder/kitty-cache

いくつかのパフォーマンスベンチマークとehcacheがあります。

SimpleJPA プロジェクトで2次キャッシュとして使用されます。

9
Travis Reeder

LinkedHashMapをチェックアウトして、サードパーティのjarなしで単純なキャッシュを実装できます。

    Map <String, Foo> cache = new LinkedHashMap<String, Foo>(MAX_ENTRIES + 1, .75F, true) {

        public boolean removeEldestEntry(Map.Entry<String, Foo> eldest) {
            return size() > MAX_ENTRIES;
        }
    };

その後、次のようにキャッシュから取得できます

    Foo foo = cache.get(key);
    if (foo == null && !cache.containsKey(key)) {
        try {
            FooDAO fooDAO = DAOFactory.getFooDAO(conn);
            foo = fooDAO.getFooByKey(key);
            cache.put(key, foo);
        } catch (SQLException sqle) {
            logger.error("[getFoo] SQL Exception when accessing Foo", sqle);
        }
    }

読者のための練習として残ります:)

8
JeeBee

[〜#〜] jcs [〜#〜] が試行され、真です。キャッシングメカニズムに関する限り、軽量ですが、実際のコードを掘り下げて、HashMapで何をするのかを、必要なものだけにまねることができます。あなたはあなたが探しているものについてかなり良い考えを持っているようです。

5
Ichorus

memcachedにはJava用のクライアントがあります。 http://www.danga.com/memcached/ キャッシングサーバーとして別のプロセスが必要ですが、強力なものです。

3
Zorkus