Java中具有过期控制的分布式缓存

3

这个需求是要缓存大量的小对象(100,000到1,000,000),并根据未来事件控制单个对象的过期时间。 过期时间没有时间组件。

缓存必须对多个应用程序服务器(SpringSource dm Server)可用,并且最好本身是可分发和容错的。

我一直在研究Terracotta作为可能的解决方案。那是一个好的选择吗?还有更好的选择吗?


我可能对问题的理解有误,但是如果您控制CRUD并且控制缓存,那么有什么阻止您使用任何分布式缓存(我相信ehcache是人群的最爱),然后在您需要时手动使对象失效?如果过期没有时间组件,则将TTL / TTI设置得非常高(以防一些对象应该在一段时间后被丢弃)或者完全关闭它。 - SCdF
我们可以使用任何分布式缓存,只要它能让我们通过外部触发器控制删除单个项目。我正在寻找经验和对最佳解决方案的建议。根据ehcache.org的说法,使用分布式EH Cache解决方案(版本1.5)可能存在数据不一致的问题。Terracotta似乎没有这个问题。 - Eric J.
4个回答

4

我认为最适合你的选择是JBoss Infinispan (http://www.jboss.org/infinispan)。这个缓存设置起来非常简单,支持复制、清除、持久化等多种功能。更重要的是,这个缓存可以在你的应用服务器中使用。你还可以通过REST访问缓存,并且有抽象层用于将Hibernate连接到它上面。


1

一些来自键值世界的新手可能是一个替代方案。如果我正确理解了您的要求,memcached似乎是一个非常适合的选择,开销非常小。客户端一致性哈希将为您提供相当不错的容错能力。

Redis、Voldemort或Tokyo Tyrant也可能是相关的,即使它们更多地涉及存储而不是缓存。特别是Redis具有一些非常出色的功能(列表、集合、原子操作等)


1
我们一直在使用Terracotta,非常满意。它的分布式缓存和缓存清除器是解决我们问题的好方法。

对于缓存失效,我的理解是如果从基础数据库中删除了一行,并且删除操作是通过Terracotta/Hibernate进行的,那么Terracotta将从缓存中删除该行。这个理解正确吗? - Eric J.
我不完全确定删除操作,但只要通过Hibernate进行写入操作,就可以保持同步。这份文档可能会更有帮助:http://www.terracotta.org/web/display/orgsite/Terracotta+for+Hibernate+Reference+Guide - Malaxeur
Eric,你说得没错,但这不是Terracotta的一个特性,而是Hibernate的一个特性,因此任何缓存提供程序都可以做到(如ehcache和Infinispan)。 - Sanne

1

你考虑过Memcached吗?你特别提到了小对象:在这方面,memcached非常出色。它是分布式和容错的,非常快速,开源的,在各个地方都得到积极使用和维护,并且有两个很棒的Java客户端API:Danga和Spy。

唯一不符合你要求的是memcached缺乏对象过期时间组件。我相信一个对象可以在缓存中停留的最长时间是30天。但具体情况因人而异。


谢谢您的建议。然而,这并不符合要求,因为过期必须是外部触发的,并且对象必须在缓存中无限期保留,直到过期。 - Eric J.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接