我有一个应用程序需要每秒数千次从分布式缓存中获取对象。我一直在使用 Hazelcast 的 IMap.get(),但似乎当我调用它时,我的对象的反序列化代码也会被调用。我们无法承受一遍又一遍反序列化的开销。
有没有办法让 Hazelcast 保存完整的对象而不是字节数组?
(我会将此发送到 Hazelcast 邮件列表,但 Google 群组拒绝让我发帖。)
我有一个应用程序需要每秒数千次从分布式缓存中获取对象。我一直在使用 Hazelcast 的 IMap.get(),但似乎当我调用它时,我的对象的反序列化代码也会被调用。我们无法承受一遍又一遍反序列化的开销。
有没有办法让 Hazelcast 保存完整的对象而不是字节数组?
(我会将此发送到 Hazelcast 邮件列表,但 Google 群组拒绝让我发帖。)
对您的问题的简短回答是否定的,没有办法阻止每次访问时对字节数组进行反序列化(有一个小例外,见下文。)
为了让 Hazelcast 与集群中的其他节点共享您的对象,它必须将这些对象的序列化版本作为字节数组传递。因此,每次调用IMap.get(key)
Hazelcast 时,都会从拥有它的任何节点检索代表对象的字节数组,并对其进行反序列化以创建对象的克隆副本。没有办法解决这个问题,并且仍然有一个在集群中的多个节点之间保持一致的分布式映射。
有一个小例外。默认情况下,IMaps 将为请求节点拥有的对象缓存实际的反序列化对象。这是使用cache-value
配置参数设置的(默认为true
)。但是,除非您在修改对象后显式执行(或、或、或其变体之一),否则对该缓存值的任何更改都不会分发到其他节点。请参阅 Hazelcast 文档中的第 18.1 节第 2 项。IMap.put(key, value)
replace
set
启用near-cache
映射将节省从拥有节点检索字节数组的成本(即通过网络将字节从拥有节点传输到请求节点),因为它将字节缓存在请求节点上,但反序列化仍然发生在每次访问。这以牺牲一致性为代价为您提供了更好的性能。它对于检索不经常更改的对象很有用。