1

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

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

任何帮助将非常感激。

4

2 回答 2

1

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

于 2014-03-14T17:11:31.230 回答
0

维维克,

如果对象的大小太大,使用 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 等)性能要好得多。

于 2015-11-17T06:23:00.690 回答