用于非可序列化对象的分布式缓存

时间:2014-08-22 03:52:32

标签: java caching distributed distributed-computing distributed-caching

出于性能原因,我的应用程序需要缓存不可序列化的对象。这些不可序列化的对象是从外部资源构建的内存中模型。例如,验证模板作为XML存储在数据库中,并且通过解析XML来构建内存模型。内存模型的构建成本相对较高,因此缓存可以提高性能。但是,当更改基础记录时,需要从数据库重新加载内存模型。

在单个应用程序场景中,我将对象存储在一个简单的地图中。在数据库中更改记录时,将重建内存模型并替换映射中的旧条目。

在分布式方案中,我需要使失效消息在集群中传播,以便所有节点在记录更改时重建内存模型。我查看了Infinispan和Hazelcast,他们都要求所有缓存的对象都可以序列化。但是,如果缓存在无效模式下运行(数据不通过线路发送),我不明白为什么缓存对象需要可序列化。

此方案中常用的技术是什么?这种情况是不寻常的(即我应该做些不同的事情)?

1 个答案:

答案 0 :(得分:0)

  

但是,如果缓存以无效模式运行(数据为   没有通过电汇发送)

  • 不完全确定这意味着什么,为什么将对象存储在分布式缓存中呢? 你是怎么在第一时间把它们放到缓存中的?

您的对象不必在纯Java意义上可序列化,即,它们不必实现Serializable接口。但是,由于您的缓存是分布式的,无论是Hazelcast还是Memcached或EhCache,您需要通过线路获取Java对象并以一些外部格式将它们存储在缓存中,然后能够从缓存中恢复它们并作为Java对象恢复。这称为编组/解组,或...序列化/反序列化。您可以考虑各种格式:XML,Json,Bson,Yaml,Thrift等。有许多框架和库可以帮助您使用这些不同的序列化模式。 XStream,JAXB,Jackson,Apache Camel等。

就Hazelcast而言,其文档明确指出:“所有分布式对象(如键和值对象,您提供给分布式队列的对象以及分布式可调用/可运行对象)都必须是可序列化的。”可能你可以考虑Guava内存缓存吗?

相关问题