gemfire自定义序列化无济于事

时间:2014-03-14 04:27:56

标签: java serialization deserialization gemfire

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

  1. 当我尝试执行任何on-server函数调用时,它会开始反序列化数据并且它非常耗时,有时需要一个多小时来迭代缓存中的对象。 (对象数量接近600万)。
  2. 我尝试使用gemfire自定义序列化(DataSerializer类)。并且所有数据在缓存中所占用的内存量大约为60GB,如果我使用Java默认序列化则相同。
  3. 我尝试使用名为Kryo https://github.com/EsotericSoftware/kryo的库,这确实有很大帮助,但我仍然不明白为什么gemfire序列化对我没有帮助,因为我序列化了该类的每个属性因此,编写类标题和任何其他元数据不应该有任何负担。
  4. 任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:1)

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

中详细了解相关信息

答案 1 :(得分:0)

的Vivek,

如果对象的大小太大,将有助于使用Gemfire https://pubs.vmware.com/vfabric5/index.jsp?topic=/com.vmware.vfabric.gemfire.6.6/getting_started/quickstart_examples/delta_propagation.html

的Delta Propagation功能

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

我还发现客户端缓存上的正常PUT比使用Function执行(onRegion或onServers等)更高效。