【问题标题】:Using ehcache in front of memcached在memcached前​​面使用ehcache
【发布时间】:2011-03-24 05:12:01
【问题描述】:

我们有一个从数据库加载用户对象的网络应用程序。它是一个具有数千个并发用户的大容量应用程序,因此我们正在寻找缓存用户对象以最小化数据库负载的方法。

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

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

有没有人使用过由 memcached 支持的 ehcache(即首先查看 ehcache,如果用户不存在,则查看 memcache,如果不存在则查看数据库)?

这种方法有什么缺点吗?

【问题讨论】:

  • 没有。我们目前只是在使用 ehcache,但随着负载的增加,内存正在成为瓶颈。
  • 您的意思是 'ehcache' 还是 'memcached' - 您原来的问题是说您使用的是 'memcached'
  • “目前在生产中使用ehcache”,我们正在使用memcached进行测试

标签: java caching jakarta-ee memcached ehcache


【解决方案1】:

如果您愿意离开 Ehcache,可以考虑 Infinispan,它现在包括与 memcache 的集成。与 Ehcache 相比,开始工作有点麻烦,但不会太多。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。这些对象很大,而且应用程序需要加载的不仅仅是在线用户,因此可以访问大量对象(约 500 万用户)。除了缓存策略外,我们还在考虑缩减用户对象。
    • 啊,有很多事情要处理。您是否有可用的硬件资源来使用更大的堆供 ehcache 使用?您可能对我发布的here 的 JVM 调优感兴趣,它允许我们使用 24GB 堆和低暂停 GC。
    • 不幸的是,它不能投入更多的内存。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      你可以很简单地覆盖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 开始应该不会太难。

      【讨论】:

        【解决方案5】:

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

        查看我的帖子了解更多详情:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2017-07-15
            • 1970-01-01
            • 2011-08-14
            • 1970-01-01
            • 2011-08-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多