軽量JavaオブジェクトキャッシュAPI [終了]


99

質問

JavaインメモリオブジェクトキャッシングAPIを探しています。何かお勧めですか?過去にどのようなソリューションを使用しましたか?

電流

現在、私はマップを使用しています:

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

必要条件

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

  • 最大サイズ
  • 有効期間

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

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

提案

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

  • Guava CacheBuilder-活発な開発。このプレゼンテーションを参照してください。
  • LRUMap -APIによる構成。TTLなし。キャッシング専用ではありません。
  • whirlycache -XML設定。メーリングリスト。最終更新2006年。
  • cache4j -XML設定。ロシア語のドキュメント。最終更新2006年。

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

  • JCS-プロパティ構成。広範なドキュメント。
  • Ehcache -XML設定。広範なドキュメント。グーグルのヒットによると断然最も人気があります。

3
インメモリキャッシュの候補セクションを編集して、Guavaキャッシュを含めることはできますか?私はあなたと同じように軽量のキャッシュメカニズムを探していて、この質問を見つけましたが、グアバはかなりダウンしているので見つかりませんでした。今、私はグアバキャッシュパッケージを使用し、それは素晴らしいです。
andras

1
できました。:-)気に入ってくれてとても嬉しいです!
Kevin Bourrillion、2012年

また、比較的新しいcache2kを追加することも検討したいと思うかもしれません。その上でベンチマークページで、ehcacheをし、グアバよりもはるかに優れた性能を持っていると言われています。
user3001 14

回答:


57

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時間です。


2
EHCacheはオブジェクトを参照するだけですか、それとも代わりにオブジェクトをシリアル化してから逆シリアル化しますか?
フオングエン

2
EHCacheは重いソリューションですか?AndroidにAPIキャッシュを実装するために、既存のキャッシングソリューションを調査しています。
Matthias

2
Androidには重すぎます。キティキャッシュを使用しています。
フェリペ

@Stevet K、このキャッシュテクノロジーを知るのは遅いですが、getInstance()が削除または変更されたと思います。
Menai Ala Eddine-アラジン

46

Google GuavaAPI)にMapMaker付属しているものが本当に好きです

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パッケージを導入しました(それらの使用方法に関する素晴らしいWikiエントリがあります)。



@mxttie:ありがとう、リンクを追加しました。このような追加の編集を提案してください。
Joachim Sauer

10

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

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

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

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


1
ナイスなものですが、TTLさえあれば。
Rosdi Kasim、2011

よろしくお願いします!誰かがすでに何かをオープンソース化しているかどうかを確認する前に入力していたコードだけです:)
jpillora

@RosdiKasimには、put()呼び出しで実際にTTLがあります。例:cache.put( "mykey"、value、500); 500はTTLです。
Travis Reeder

1
@TravisRまあ...、当時TTLはありませんでした..:p
Rosdi Kasim

ああ、そのコメントがどれくらい前にあるのか理解していませんでした。
Travis Reeder、2013年

9

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);
        }
    }

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


2
この方法にはTTL容量はないと思います。しかし、それはあなた自身のローリングに向けた良いスタートになるでしょう。
Chase Seibert

ええ、私は読者の練習の一部としてTTLのものを残します:p-そしてもちろん、サードパーティのライブラリはあなた自身のものを転がすよりもはるかに多くテストされます。
JeeBee 2008年


5

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


キャッシングメカニズムに関しては、軽くないと思いますか?ただし、これは最も人気のあるエンタープライズソリューションの1つであるようです。
Chase Seibert

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.