Terracotta禁用L2缓存和对象序列化

时间:2012-07-26 14:32:32

标签: caching distributed ehcache terracotta

我对Terracotta很新,我已经安装并使其与EHcache一起正常工作以进行分发缓存,但我现在得到的并不是我真正想要的。 在我的应用程序中,我希望有几个带有ehcache的客户端缓存(L1),并将已删除密钥的失效从客户端“传播”到所有其他客户端。我不希望我的缓存也驻留在兵马俑服务器上,所以我想简单地禁用L2缓存,这样我的对象就不需要可序列化(在缓存上执行的唯一操作是PUT和REMOVE) 。 我知道这可以使用简单的ehcache来完成,但我的环境中没有多播支持(Amazon EC2),我的客户端将自动创建自动缩放功能,因此我无法知道他们的IP。 基本上,我只需要一个Terracotta Server将失效请求传播给所有客户端。有没有办法实现这个目标? 非常感谢!

1 个答案:

答案 0 :(得分:0)

当您使用Terracotta支持的EhCache并在缓存配置中指定使用陶土时,例如:

<cache name="com.xyz.MyPOJO"
  <terracotta/>
</cache>

那么你的类必须是可序列化的(因为Terracotta会尝试将它存储在缓存服务器实例上。

但是,在您的配置中,您可以指定不将Terracotta用于某些缓存,例如

<cache name="com.xyz.MyPOJO"
  <terracotta/>
</cache>

<cache name="com.xyz.NotServerStoredPOJO"
</cache>

然后上面示例中的“NotServerStoredPOJO”将不会存储在兵马俑缓存服务器上...而是只存在于您的本地EhCache中......但是通过这样做,您将无法将其传播到其他如果你的EhCache在diff JVMs中的实例。

所以,也许你需要在兵马俑服务器上保留一些东西(某种标志/ ids)来指示无效的东西。然后在你的应用程序代码中有一个共同的类/功能,它将检查之前的标志从本地EhCache获取值...如果它找到要删除的标志/ id,那么它将从本地删除它缓存并且不会向请求者返回任何内容。

另一方面,您的用例类型会破坏具有中央缓存服务器的目的。如果要在没有中心位置的情况下协调多个缓存实例,可以使用JGroups http://www.jgroups.org(而不是Terracotta)......它也没有商业许可证。但是你需要在JGroups上实现自己的机制,如何使本地EhCache实例中的某些条目无效......