2009-09-18 39 views
3

要求是缓存大量(100,000到1,000,000)小对象,并根据未来事件控制单个对象的到期日期。没有时间组件到期。在Java中具有到期控制的分布式缓存

缓存必须可用于许多应用程序服务器(SpringSource dm服务器),理想情况下应该是可分发和容错本身。

我一直在寻找兵马俑作为一种可能的解决方案。这是一条好路吗?有更好的吗?

+0

我可能会理解错误的问题,但是如果您控制CRUD并控制缓存,那么什么是阻止您使用*任何分布式缓存(ehcache,我相信这是人群喜爱的),然后随时手动使对象无效?如果没有时间组件到期,则要么​​将TTL/TTI设置得非常高(以防万一某些对象确实应该在一段时间后被抛出)或完全关闭。 – SCdF 2009-09-20 20:57:47

+0

我们可以使用任何分布式缓存,让我们控制通过外部触发移除单个项目。我正在寻找最佳解决方案的经验和建议。根据ehcache.org的说法,分布式EH Cache解决方案存在数据不一致的可能性(对于版本1.5)。兵马俑似乎没有这个问题。 – 2009-09-21 16:31:01

回答

1

我们一直在使用兵马俑,我们对此非常满意。它具有Cache Evictors的分布式缓存解决了我们的问题。

+0

对于缓存失效,我的理解是,只要删除操作通过Terracotta/Hibernate发生,Terracotta将从缓存中删除一行,如果它从底层数据库中删除。那是对的吗? – 2009-09-19 00:12:16

+0

我不是百分百肯定的删除,我知道只要它通过Hibernate,写入就保持同步。这个文档可能会帮助你更多:http://www.terracotta.org/web/display/orgsite/Terracotta+for+Hibernate+Reference+Guide – Malaxeur 2009-09-19 00:17:40

+0

埃里克,这是正确的,但它不是兵马俑的功能,它是Hibernate的一个功能,所以任何缓存提供者将能够做到这一点(作为ehcache和Infinispan) – Sanne 2011-06-09 22:23:40

1

一些(更少或更少)来自关键价值世界的新来者可能是另一种选择。如果我理解你的要求正确,memcached就会自然适应,而且开销很小。客户端一致性散列会为您提供相当好的容错性。

Redis,Voldemort或东京暴君也可能是相关的,即使他们更关心存储而不是缓存。 Redis尤其具有一些非常性感的功能(列表,设置,原子操作...)

1

您是否考虑过Memcached?您特别提到了小对象:memcached在这方面很出色。它具有分布式和容错性,速度非常快,开放源代码,在任何地方都得到积极使用和维护,并且拥有两个优秀的Java客户端API:Danga和Spy。

memcached不符合你的唯一要求是没有时间组件来过滤对象。我相信对象可以在缓存中花费的最长时间是30天。因人而异。

+0

感谢您的建议。但是,这不符合要求,因为必须从外部触发到期并且对象必须无限期地保留在缓存中,直到过期。 – 2009-09-21 16:20:21

4

我认为你最好的选择是JBoss Infinispan(http://www.jboss.org/infinispan)。缓存很简单,设置简单,支持复制,驱逐,持久性等等。更重要的是,缓存在你的应用服务器中工作。您也可以使用REST访问缓存,并且有抽象的将Hibernate连接到它。