web-dev-qa-db-ja.com

クラスター共有キャッシュ

複数のJVM間でキャッシュを共有できるJavaフレームワークを探しています。

私が必要とするのは Hazelcast のようなものですが、「分散」部分はありません。キャッシュにアイテムを追加して、他の「グループメンバー」キャッシュに自動的に同期できるようにしたい。可能であれば、信頼性の高いマルチキャスト(または同様のもの)を介してキャッシュを同期させたいと思います。

Shoal を見てきましたが、残念ながら「分散状態キャッシュ」は私のニーズには不十分な実装のようです。

JBoss Cache を見てきましたが、私がやらなければならないことには少しやり過ぎのようです。

JGroups を見てきましたが、これは私がやらなければならないことに対して最も有望なツールのようです。 JGroupsの経験はありますか?共有キャッシュとして使用された場合はどうでしょうか。

他の提案はありますか?

ありがとう!

[〜#〜] edit [〜#〜]:HazelcastとInfinispanのどちらかを決定するのに役立つテストを開始しています。回答を受け入れますすぐに。

[〜#〜] edit [〜#〜]:突然の要件変更により、分散マップは不要になりました。低レベルのシグナリングフレームワークにはJGroupsを使用します。皆さんの助けに感謝します。

26
GuiSim

さらに検索したところ、 JGroupのReplicateHashMap が見つかりました。徹底的にテストされていませんが、素晴らしいスタートのようです。それは私が必要としない機能をあまり与えずに私のすべての要件を満たします。また、非常に柔軟性があります。私はまだ「完璧な」答えを探しています:)

あなたの答えをありがとう。

9
GuiSim

これはどう?

ローカルキャッシュとしてローカルConcurrentHashMapを用意します。 Hazelcast分散マップ/キャッシュを作成します。分散マップイベントのリッスンを開始し、ローカルのConcurrentHashMapを更新します。

これで、各メンバーのローカルキャッシュは同じになります。自動同期。

import com.hazelcast.core.IMap; 
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.EntryListener;
import com.hazelcast.core.EntryEvent; 
import Java.util.concurrent.ConcurrentHashMap;

public class Sample implements EntryListener {
        Map localCache = new ConcurrentHashMap ();

        public static void main(String[] args) { 
                Sample sample = new Sample();
                IMap   map    = Hazelcast.getMap("default"); 

                //Listen for all added/updated/removed entries
                map.addEntryListener(sample, true);  
        }

        public void entryAdded(EntryEvent event) {
             localCache.put(event.getKey(), event.getValue());            
        }

        public void entryRemoved(EntryEvent event) {
             localCache.remove(event.getKey());            
        }

        public void entryUpdated(EntryEvent event) {
             localCache.put(event.getKey(), event.getValue());            
        }
}
13
Talip Ozturk

Infinispanを検討しましたか- http://www.jboss.org/infinispan/ ? APIは非常にシンプルで、標準(JSR-107)に基づいています。使い方もとても簡単です

CacheManager manager = new DefaultCacheManager(
                GlobalConfiguration.getClusteredDefault() );

Cache cache = manager.getCache();

cache.put("key", "value");

-ハーディ

9
Hardy

テラコッタを検討しましたか?やり過ぎかもしれません: http://www.terracotta.org/web/display/orgsite/Data+Caching

しばらく前にキャッシングの分野でJSRがありましたが、次のいずれかが法案に適合しますか? http://Java-source.net/open-source/cache-solutions/jcache

私は数年前に個人的にFKacheを使用し、それはうまく機能しましたが、分散モードでは使用しませんでした。

データのローカルコピーを含む分散キャッシュであることが重要ですか?必要な共有メモリであれば、JavaSpacesのものもあります...

5
Dan Gravell

私はこの分野でいくつかのテクノロジーを使用しましたが、あなたがやろうとしていることの最良の選択として JBoss Cache を強くお勧めします。トランスポートとしてJGroupsを使用しますが、より高レベルのトランザクション抽象化を提供します。すぐに使用できるので、分散ツリーノード構造が得られます。

編集:ああ、JBossCacheはJBoss Application Serverから独立しているので、どの環境でも使用できます。どちらかといえば、JBossASの内部よりも外部の方がうまく機能します。

3
skaffman

Memcached にはいくつかあります Javaクライアント

1
John Meagher

http://ehcache.org/ は非常に優れた軽量キャッシュです。複数のJVM間で共有できます。内部的にはJGroupsを使用できます。

0
Andrej Fink

私のオプションは Java Caching System Apacheからで、TCPラテラルキャッシュをサポートしています。これは私の意見では、必要な機能です。

0
victor hugo