26

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

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

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

我看过JBoss Cache但对于我需要做的事情来说似乎有点矫枉过正。

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

还有其他建议吗?

谢谢 !

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

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

4

8 回答 8

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());            
        }
}
于 2009-06-11T17:50:55.317 回答
9

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

感谢您的回答。

于 2009-06-11T19:31:40.083 回答
9

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

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

Cache cache = manager.getCache();

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

——哈代

于 2009-06-12T08:49:03.443 回答
5

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

前段时间在缓存领域有一个 JSR,以下是否符合要求:http: //java-source.net/open-source/cache-solutions/jcache

几年前我个人用过FKache,效果很好,但是我没有在分布式模式下使用它。

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

于 2009-06-11T17:05:14.257 回答
3

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

编辑:哦,JBossCache 独立于 JBoss Application Server,你可以在任何环境中使用它。如果有的话,它在 JBossAS 之外比在它内部工作得更好。

于 2009-06-12T08:57:33.377 回答
1

Memcached有几个Java 客户端

于 2009-06-11T16:52:23.790 回答
0

我的选择是Apache 的Java 缓存系统,它支持 TCP 横向缓存,我认为这是您需要的功能。

于 2009-06-11T17:14:16.607 回答
0

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

于 2010-09-20T10:12:47.517 回答