群集共享缓存

时间:2009-06-11 16:46:12

标签: java caching distributed-computing cluster-computing

我正在寻找一个允许我在多个JVM之间共享缓存的java框架。

我需要的是Hazelcast,但没有“分布式”部分。我希望能够在缓存中添加一个项目并让它自动同步到另一个“组成员”缓存。如果可能的话,我希望通过可靠的多播(或类似的东西)来同步缓存。

我看过Shoal,但遗憾的是“分布式状态缓存”似乎不能满足我的需求。

我看过JBoss Cache,但对于我需要做的事情似乎有些过分。

我看过JGroups,这似乎是我需要做的最有前途的工具。有没有人有JGroups的经验?最好是否用作共享缓存?

还有其他建议吗?

谢谢!

编辑:我们正在开始测试以帮助我们在Hazelcast和Infinispan之间做出决定,我很快就会接受答案。

编辑:由于需求突然变化,我们不再需要分布式地图了。我们将使用JGroups作为低级信令框架。谢谢大家的帮助。

8 个答案:

答案 0 :(得分:13)

这个怎么样?

将本地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());            
        }
}

答案 1 :(得分:9)

经过一番搜索后,我找到了JGroup's ReplicatedHashMap。它尚未经过彻底测试,但似乎是一个很好的开始。它满足了我的所有要求,而没有给我太多我不需要的功能。它也非常灵活。我仍然在寻找“完美”的答案:)

感谢您的回答。

答案 2 :(得分:9)

您是否考虑过Infinispan - http://www.jboss.org/infinispan/? API非常简单,基于标准(JSR-107)。用法也很简单

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

Cache cache = manager.getCache();

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

- 哈迪

答案 3 :(得分:5)

你考虑过兵马俑吗?可能有点矫枉过正:http://www.terracotta.org/web/display/orgsite/Data+Caching

前一段时间有一个JSR在缓存领域,请执行以下任何一项法案:http://java-source.net/open-source/cache-solutions/jcache

几年前我个人使用过FKache并且运行良好,但我没有在分布式模式下使用它。

重要的是它是具有本地数据副本的分布式缓存吗?如果它是你需要的共享内存,还有JavaSpaces的东西......

答案 4 :(得分:3)

我在这方面使用了一些技术,我强烈建议JBoss Cache作为你想要做的事情的最佳选择。它使用JGroups作为传输,但提供更高级别的事务抽象。开箱即用,它为您提供了分布式树节点结构。

编辑:哦,JBossCache独立于JBoss Application Server,您可以在任何环境中使用它。如果有的话,它在JBossAS之外的效果要好于它内部的效果。

答案 5 :(得分:1)

Memcached有几个Java Clients

答案 6 :(得分:0)

我的选项是来自Apache的Java Caching System,它支持TCP Lateral Cache,我认为这是你需要的功能。

答案 7 :(得分:0)

http://ehcache.org/是非常好的轻量级缓存。它可以在多个JVM之间共享。 在内部,它可以使用JGroups。