2011-03-24 56 views
6

我們有一個從數據庫加載User對象的Web應用程序。它是一個擁有數千個併發用戶的高容量應用程序,所以我們正在尋找緩存User對象的方法來最大程度地減少數據庫負載。在memcached前​​使用ehcache

目前使用ehcache,但正在研究memcached以降低應用程序的內存要求,並使其更具可擴展性。

我們當前使用memcached時遇到的問題是序列化User實例帶來的CPU負載。我們正在研究如何加速序列化,但是也考慮是否可以使用由memcached服務器支持的較小的ehcache緩存。

有沒有人有使用eHcache支持memcached的任何經驗(即先看看ehcache,如果用戶不在那裏,看看memcache,如果沒有看看數據庫)?

這種方法的缺點是什麼?

+0

是否必須是ehcache? – skaffman 2011-03-24 09:02:49

+0

不,我們目前正在使用ehcache,但隨着負載的增加,內存正在成爲瓶頸。 – objects 2011-03-24 09:36:19

+0

您是不是要找「的Ehcache」或「memcached的」 - 你原來的問題說,你用「memcached的」 – 2011-04-02 12:13:39

回答

1

做你的建議確實有意義。我們已經遇到了與memcached相同的問題,因爲來回序列化對象的開銷不值得單獨用於大量應用程序。擁有本地緩存​​可減少應用程序端的負載,同時memcached可減少數據庫端的負載。缺點在於寫入兩層緩存和保持緩存一致性的複雜性。我會盡量減少你需要使用它的地方。

+0

感謝您的答覆測試。對象比較大,加上應用程序需要加載的不僅僅是在線用戶,因此他們可以訪問大量的用戶(大約500萬用戶)。除了緩存策略外,我們還在研究修剪用戶對象。 – objects 2011-03-24 08:49:10

+0

啊,這是很多要處理的。你有沒有硬件資源可以使用一個更大的堆來使用ehcache?您可能對我發佈的JVM調優感興趣[這裏](http://stackoverflow.com/questions/5350212/apllication-servers-maximum-memory-limit/5350372#5350372),它允許我們使用24GB堆低GC暫停。 – WhiteFang34 2011-03-24 09:01:36

+0

不幸的是拋出更多的內存不是一個選項。 – objects 2011-03-24 09:36:44

2

如果您願意離開Ehcache,您可以考慮Infinispan,現在包括與memcache的集成。與Ehcache相比,這樣工作有點多,但不是太多。

從版本4.1開始,Infinispan分佈包含一個實現memcached文本協議的服務器模塊。這允許memcached客戶端與一個或多個Infinispan支持的memcached服務器通信。這些服務器可以獨立工作,就像memcached一樣,每個服務器獨立運行,並且不與其他服務器通信,也可以在服務器複製或將其內容分發到其他Infinispan支持的memcached服務器的羣集中,從而爲客戶端提供故障轉移功能。

+0

謝謝,請看看 – objects 2011-03-24 11:22:49

1

Infinispan的可存儲對象的情況下,儘量減少序列化的開銷,也代替複製每個節點上的數據就可以分發數據,使你的內存更好的使用,也可以限制條目保存在內存量。 當你更新一個值時,你也可以讓失效消息發送給其他節點,而不是發送序列化值。

此外,當它仍然需要序列化時,它使用一個非常高效的Marshaller而不是Java的序列化,並且從版本5開始,您可以插入自定義Externalizer來自定義某些類型的連線格式, (通常不需要,但很好有)。

如果您出於其他原因查看memcached,請注意Infinispan也會「說出」memcached文本協議,因此如果您身邊有其他客戶端,您仍然可以與其集成。

0

你可以很簡單地覆蓋net.sf.ehcache.Cache.createDiskStore()

new Cache(..) { 
    protected Store createDiskStore() { 
    if (isDiskStore()) { 
     // default: return DiskStore.create(this, diskStorePath); 
     MemcachedStore store = new MemcachedStore(..); 
     getCacheConfiguration().addConfigurationListener(store); 
     return store; 
    } else { 
     return null; 
    } 
    } 
} 

MemcachedStorenet.sf.ehcache.store.Store自定義實現,你必須做你自己。這不是微不足道的,但是再次,從DiskStore開始不應該太困難。

0

您不能替換ehcache中的DiskStore,因爲它的最終版本。你可以實現一個新的OffHeapStore並且像這樣插入它。這是BigMemory的工作原理。有一個名爲DirectMemory的Apache項目也在做同樣的事情。

看到我的帖子在這裏更多的細節:

http://forums.terracotta.org/forums/posts/list/0/8833.page#40635