我已从 Memcached 切换到 Hazelcast。一段时间后,我注意到缓存的大小比平常大。以人为中心。
所以我确实喜欢这样: 1. 在调用 IMap.set(key,value(ArrayList) 之前,我将值反序列化为大小为 128K 的文件。 2. 调用 IMap.set() 后,我使用 IMap.get() 相同的 map ,突然间该 map 的大小变为6 MB。
相关对象有许多对象,这些对象在同一结构中被多次引用。
我打开了 2 个二进制文件,发现 6MB 文件有很多重复数据。 hazelcast 使用的序列化以某种方式复制了引用
除枚举之外,为缓存实例化的所有类都是可序列化的。
使用 Memcached 时,两种情况下的值大小均为 128K。
我尝试过 Kryo 与 hazelcast,并没有真正的区别,仍然超过 6MB
有人对 hazelcast 有类似的问题吗?如果是,您如何在不更改缓存提供程序的情况下解决此问题。
如果有人需要的话,我可以提供对象结构并尝试使用非敏感数据重现它。
最佳答案
Hazelcast 可以配置为使用多种不同的序列化方案; Java 序列化(默认)在时间和空间方面效率最低。通常,选择正确的序列化策略比您可以做的几乎任何其他优化都能获得更大的返回。
引用手册很好地概述了不同的序列化方案和所涉及的权衡。 IMDG Reference Manual v3.11 - Serialization
如果我的应用程序全部是 Java,我通常会选择 IdentifiedDataSerialized;如果我需要支持跨语言客户端或对象版本控制,我通常会选择 Portable。
如果出于某种原因需要使用 Java 序列化,您可以检查并验证 SharedObject 属性是否设置为 true,以避免创建同一对象的多个副本。 (该属性可以通过 hazelcast.xml 中的元素设置,或通过 SerializationConfig 对象以编程方式设置)。
关于java - Hazelcast Java 序列化/反序列化 ArrayList 陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53501112/