2009-06-11 149 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。