java - Hazelcast Java 序列化/反序列化 ArrayList 陷阱

标签 java serialization hazelcast

我已从 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/

相关文章:

Java快速图像比较

c++ - 序列化所需的公共(public)空构造函数

java - Hazelcast - 从 map 中删除过期的 session

c# - LINQ 序列化

linux - 将 hazelcast 管理中心警报与 Pagerduty 集成

java - 如何创建 hazelcast 实例

java - Java中将ByteArray转换为String时出现奇怪的字符

java - 为什么我无法访问存储在 ArrayList 元素中的对象的属性?

java - 在 Java 中将 iCal 转换为 HTML 或纯文本

java - readObject() 方法不打印对象