gemfire自定义序列化没有帮助

Posted

技术标签:

【中文标题】gemfire自定义序列化没有帮助【英文标题】:gemfire custom serialization not helping 【发布时间】:2014-03-14 04:27:56 【问题描述】:

我使用 gemfire 作为我的缓存。缓存堆大小远高于 100GB。我发现当我们从客户端将数据放入 gemfire 缓存中时,它会将数据序列化并发送到服务器,并且在服务器上数据以序列化的形式存储。 问题:

    当我尝试执行任何服务器上的函数调用时,它会开始反序列化数据,这确实非常耗时,有时仅遍历缓存中的对象就需要一个多小时。 (对象数量接近 600 万个)。 我尝试使用 gemfire 自定义序列化(DataSerializer 类)。所有数据都在缓存中后所需的内存量大约为 60GB,如果我使用 Java 默认序列化,则它是相同的。 我尝试使用名为 Kryo https://github.com/EsotericSoftware/kryo 的库,这确实有很大帮助,但我仍然不明白为什么 gemfire 序列化对我没有帮助,因为我正在单独序列化类的每个属性,所以不应该成为编写类头和任何其他元数据的负担。

任何帮助将不胜感激。

【问题讨论】:

@JasonC 更正了拼写错误。 【参考方案1】:

您是否考虑过在服务器 cache.xml 中使用 read-serialized=true 选项?将此属性设置为 true 将允许服务器对缓存对象执行操作,而无需先反序列化。在Pivotal documentation 中了解更多信息。

【讨论】:

我猜你说的是 PDX 自动序列化。此选项在 Gemfire 6.5 版本中不可用。所以我无法设置read-serialized=true 选项。【参考方案2】:

维韦克,

如果对象的尺寸太大,可以使用Gemfire的Delta Propagation功能https://pubs.vmware.com/vfabric5/index.jsp?topic=/com.vmware.vfabric.gemfire.6.6/getting_started/quickstart_examples/delta_propagation.html

这仍然会有一些序列化/反序列化成本,但不同之处在于,从客户端您只会将“对象中发生的变化”发送到放置的服务器,理论上这是复制到其他服务器的内容和客户,如果您在客户上注册了兴趣列表。

我还发现客户端缓存上的普通 PUT 比使用函数执行(onRegion 或 onServers 等)性能要好得多

【讨论】:

以上是关于gemfire自定义序列化没有帮助的主要内容,如果未能解决你的问题,请参考以下文章

使用 TypeAdapter 的对象中一个(多个)变量的 Gson 自定义序列化程序

序列化自定义配置

Jackson 将 YAML 文件反序列化为 Map(没有自定义反序列化器)

没有@Serializable 的数据类的自定义序列化程序

在 protobuf-net 中,有没有办法指定在序列化/反序列化给定类型时要使用的自定义方法?

Spring @RestController 自定义 JSON 反序列化器