2011-03-24 58 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