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