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

4
我的应用程序需要缓存非可序列化对象以提高性能。这些非可序列化对象是从外部资源构建的内存模型。例如,验证模板以XML格式存储在数据库中,通过解析XML构建内存模型。构建内存模型相对昂贵,因此缓存可以提高性能。但是,当基础记录更改时,需要从数据库重新加载内存模型。
在单个应用程序场景中,我将对象存储在简单的映射中。当数据库中的记录更改时,重新构建内存模型并替换映射中的旧条目。
在分布式场景中,我需要使失效消息在集群中传播,以便所有节点在记录更改时重建内存模型。我已经查看了Infinispan和Hazelcast,它们都要求所有缓存对象都必须是可序列化的。然而,如果缓存以无效模式运行(数据不跨网络发送),我不明白为什么缓存对象需要是可序列化的。
在这种情况下通常使用哪些技术?这种情况是否不寻常(即我应该做些不同的事情)?

阅读Hazelcast文档以了解分布式缓存,这可能有助于您理解整个情境。 - Nirav Prajapati
http://hazelcast.org/docs/latest/manual/html-single/ 阅读此文档。 - Nirav Prajapati
我已经阅读了很多Hazelcast文档。您认为哪一部分文档是相关的? - Nathan
嗨,伙计,我也无法正确理解这个概念。我正在使用Hazlcast来处理分布式环境中的在线离线用户。当一个节点出现问题时,我遇到了相同的问题,它会给我提供堆栈跟踪,因为序列化映射出现了问题。 - Nirav Prajapati
根据Hazelcast的文档,它具有自定义序列化功能,可以满足您的需求。请参考:http://hazelcast.org/docs/latest/manual/html-single/hazelcast-documentation.html#custom-serialization - Lolo
1个回答

1
然而,如果缓存以失效模式运行(其中未通过网络发送数据)
不太确定这是什么意思,为什么要把对象存储在分布式缓存中?你是如何将它们放入缓存中的?
您的对象不必符合纯Java序列化,即它们不必实现Serializable接口。但是,由于您的缓存是分布式的,无论是Hazelcast还是Memcached或EhCache,您需要以某种外部格式获取您的Java对象并将其存储在缓存中,然后能够从缓存中获取它们并还原为Java对象。这称为编组/解组,或...序列化/反序列化。您可以考虑各种格式:XML、Json、Bson、Yaml、Thrift等。有许多框架和库可以帮助您使用这些不同的序列化模式。XStream、JAXB、Jackson、Apache Camel等。
就Hazelcast而言,它的文档明确表示:"所有分布式对象(例如键和值对象,您提供到分布式队列中的对象以及分布式可调用/可运行对象)都必须是可序列化的。"也许您可以考虑Guava内存缓存?

然而,如果缓存以失效模式运行,则数据无需通过网络发送。 - Nathan
失效模式意味着数据从外部存储(例如数据库)加载,而不是在缓存节点之间传输。当Infinispan用作Hibernate二级缓存时,这是默认操作模式。有关更多信息,请参见我上面评论中的链接。 - Nathan

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