2009-06-11 113 views
26

我正在寻找一个能够让我在多个JVM之间共享高速缓存的java框架。集群共享高速缓存

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

我已经看过Shoal,但遗憾的是“分布式状态缓存”对于我的需求似乎不够充分。

我已经看过JBoss Cache,但对于我需要做的事似乎有点矫枉过正。

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

其他建议?

谢谢!

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

编辑:由于需求突然改变,我们不再需要分布式地图。我们将使用JGroups来构建低层信令框架。谢谢大家的帮助。

+1

Hazelcast和Infinispan?嗯。这些都不是成熟的技术......尝试在一个节点中按Hazelcast演示中的Ctrl-z。分裂的大脑。 Infinispan仍然是阿尔法!我建议你从http://java-source.net/open-source/cache-solutions开始。 EHCache,OSCache和JBoss Cache至少是成熟的公认技术。你已经说过兵马俑是重量级的,所以没关系。我只是不想看到你浪费你的时间,发现你已经完全不稳定。 – 2009-06-17 07:12:06

+0

我们还没有决定,我们只是测试。感谢您的关注Taylor :)另外,Hazelcast演示中的CTRL-Z正常工作。那么通过任务管理器或任何其他方式杀死任何节点。 – GuiSim 2009-06-17 14:46:58

+0

再次,兵马俑可以帮助你在这里;-)。在兵马俑锁定/信号是非常容易的。这是集群中线程之间的信号同步等待/通知:http://www.terracotta.org/web/display/orgsite/Recipe?recipe=waitnotify – 2009-06-18 20:21:43

回答

8

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

谢谢您的回答。

1

Memcached有几个Java Clients

+0

我没有在Web服务器上工作。我想这里的问题是术语“缓存”,这不是我正在寻找的。我需要一个共享的数据结构;) – GuiSim 2009-06-11 16:58:48

+0

Memcached与web服务器没有任何关系。这是你正在寻找的东西的类型。 – 2009-06-11 18:17:58

5

你有没有考虑兵马俑?可能是过度杀伤:http://www.terracotta.org/web/display/orgsite/Data+Caching

有一个JSR在缓存领域前不久,做以下任何适合的法案:http://java-source.net/open-source/cache-solutions/jcache

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

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

+0

我曾考虑过使用兵马俑,并计划将其作为最后的手段,正如你所说的那样,矫枉过正。 – GuiSim 2009-06-11 17:44:47

+1

不知道我在这里了解情绪。我当然有偏见 - 因为我为兵马俑工作 - 但使用兵马俑做简单的缓存实际上非常简单,应该为您提供出色的性能。 就像将ConcurrentHashMap标记为集群一样简单,并且您有一个同步缓存。看到这里的例子:http://www.terracotta.org/web/display/orgsite/Recipe?recipe=concurrenthashmap 如果你想/需要驱逐,你可以从一个附加库得到:http: //www.terracotta.org/web/display/docs/Cache+Evictor – 2009-06-11 20:56:03

0

我的选择是来自Apache的Java Caching System,它支持TCP Lateral Cache,在我看来是你需要的功能。

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

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

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

Cache cache = manager.getCache(); 

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

--Hardy

3

我已经在这个领域中使用的一些技术,我强烈推荐JBoss Cache的最佳选择你想要做什么。它使用JGroups作为其传输,但提供更高级的事务抽象。开箱即用,它为您提供分布式树节点结构。

编辑:哦,和JBossCache独立于JBoss应用服务器,你可以在任何环境中使用它。如果有的话,它在JBossAS之外比它内部更好。

0

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