在memcached前​​面使用ehcache

时间:2011-03-24 05:12:01

标签: java caching java-ee memcached ehcache

我们有一个从数据库加载User对象的Web应用程序。它是一个拥有数千个并发用户的高容量应用程序,因此我们正在寻找缓存User对象的方法,以最大限度地减少数据库负载。

目前使用ehcache但正在查看memcached以降低应用程序的内存需求,并使其更具可扩展性。

我们目前使用memcached的问题是序列化User实例带来的cpu负载。我们正在研究加快序列化的方法,但也考虑是否可以使用由memcached服务器支持的更小的ehcache缓存。

有没有人有使用memcached支持的ehcache的经验(即首先查看ehcache,如果用户不在那里,请查看内存缓存,如果不在那里查看数据库)?

这种做法有什么缺点吗?

6 个答案:

答案 0 :(得分:2)

如果您愿意离开Ehcache,可以考虑Infinispan,现在包括与memcache的集成。比起Ehcache更有效,但不是太多。

  

从版本4.1开始,Infinispan发行版包含一个实现memcached文本协议的服务器模块。这允许memcached客户端与一个或多个Infinispan支持的memcached服务器通信。这些服务器可以独立工作,就像memcached一样,每个服务器独立运行,不与其他服务器通信,或者它们可以集群在服务器复制或分发其内容到其他Infinispan支持的memcached服务器的地方,从而为客户提供故障转移功能。

答案 1 :(得分:1)

做你所建议的事情是有意义的。我们遇到了与memcached相同的问题,因为来回序列化对象的开销不值得单独用于大批量应用程序。拥有本地缓存​​可减少应用程序端的负载,而memcached可减少数据库端的负载。缺点是编写两层缓存和维护缓存一致性的额外复杂性。我会尽量减少你需要使用它的地方。

答案 2 :(得分:1)

Infinispan可以将对象存储为实例并最大限度地减少序列化开销,而不是在每个节点上复制数据,它可以分发数据以更好地利用内存,或者可以限制要保留在内存中的条目数量。 您还可以在更新值时将失效消息发送到其他节点,而不是发送序列化值。

此外,当它仍然需要序列化时,它使用非常高效的Marshaller而不是Java的序列化,并且从版本5开始,您可以插入自定义外部化器来自定义某些类型的线路格式以进行额外推送(通常不需要,但很高兴。)

如果您出于其他原因查看memcached,请注意Infinispan还“说出”memcached文本协议,因此如果您有其他客户端,您仍然可以与它集成。

答案 3 :(得分: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开始不应该太困难。

答案 4 :(得分:0)

你不能在ehcache中替换DiskStore,因为它是最终的。你可以实现一个新的OffHeapStore并像这样插入它。这就是BigMemory的工作原理。有一个名为DirectMemory的Apache项目做同样的事情。

请在此处查看我的帖子了解更多详情:

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

答案 5 :(得分:0)

本文通过定义我们自己的MultiTieredCacheManager和MultiTieredCache,指定我们如何在spring应用程序中的分布式缓存前使用进程内缓存:

Multi Tiered Caching - Using in-process Cache in front of Distributed Cache