调用IMap.get()时Hazelcast是否总是反序列化?

调用IMap.get()时Hazelcast是否总是反序列化?,hazelcast,Hazelcast,我有一个应用程序需要每秒从分布式缓存中提取数千次对象。我一直在使用Hazelcast的IMap.get(),但似乎当我调用它时,我的对象的反序列化代码也会被调用。我们负担不起反复反序列化的开销 有没有办法让Hazelcast保存完整格式的对象而不是字节数组 (我本来会将此发送到Hazelcast邮件列表,但Google groups拒绝让我发布。)您的问题的简短答案是否定的,没有办法阻止每次访问时对字节数组进行反序列化(只有一个小的例外,见下文) 为了让Hazelcast与群集中的其他节点共享您

我有一个应用程序需要每秒从分布式缓存中提取数千次对象。我一直在使用Hazelcast的IMap.get(),但似乎当我调用它时,我的对象的反序列化代码也会被调用。我们负担不起反复反序列化的开销

有没有办法让Hazelcast保存完整格式的对象而不是字节数组


(我本来会将此发送到Hazelcast邮件列表,但Google groups拒绝让我发布。)

您的问题的简短答案是否定的,没有办法阻止每次访问时对字节数组进行反序列化(只有一个小的例外,见下文)

为了让Hazelcast与群集中的其他节点共享您的对象,它必须以字节数组的形式传递这些对象的序列化版本。因此,每次调用
IMap.get(key)
Hazelcast都会从拥有对象的节点检索表示对象的字节数组,并对其进行反序列化以创建对象的克隆副本。没有办法绕过这一点,仍然可以在集群中的多个节点之间保持一致的分布式映射

有一个小的例外。默认情况下,IMaps将缓存请求节点拥有的对象的实际反序列化对象。这是通过
缓存值
配置参数设置的(默认为
true
)。但是,除非在修改对象后显式执行
IMap.put(key,value)
(或
替换
,或
设置
,或其一种变体),否则不会将对缓存值的任何更改分发到其他节点。见Hazelcast文件第18.1节第2项


为映射启用
near cache
将节省从拥有节点检索字节数组(即通过网络将字节从拥有节点传输到请求节点)的成本,因为它会在请求节点上缓存字节,但每次访问时仍会进行反序列化。这将以牺牲一致性为代价提供更好的性能。它对于检索不经常更改的对象非常有用。

顺便说一句,您的问题最终出现在Google groups电子邮件列表中。如果我维护自己的本地对象缓存,然后使用EntryListener保持同步,会怎么样?这种方法有什么坏处吗?我也这么做。我有一个10年的应用程序,重构成本很高,保持本地引用缓存是获得正常性能的唯一方法。