当前位置: 首页 > 面试题库 >

将数据表与Redis进行序列化/反序列化的最省时方法是什么?

欧阳山
2023-03-14
问题内容

我想在Redis中存储诸如a
DataTableDataset等的复杂对象。我尝试使用将它们序列化为BLOB对象JsonSerialize,但是这花费了太多时间。还有其他办法吗?


问题答案:

不幸的是,使用大型数据集时,序列化和反序列化结构总是很费时间。DataTable特别是,它们是相当复杂的对象,因为它们具有行和列,这些行和列通常附加有许多元数据-
即使它看起来像是基本表。

DataTablevs List<POCO>

考虑是否真的需要将序列化为DataTable。您能否创建一个更简单的POCO并序列化一个List<YourRecord>?换句话说,如果您不需要字段和列上的额外属性,并且可以序列化为更简单的格式,则可能更快,更节省空间。然后还原到DataTable必要的位置。

另一个选择是将拆分DataTable为较小的集合,将它们序列化并存储在较小的部分中。您可能会发现这种性能更高。 您应该能够对此进行基准测试。

基准测试:

最终,Redis缓存应在重新查询数据源的时间上有所改进。您可以使用术语takes too much time,但是如果从缓存中获取数据需要2秒钟,而查询数据源则需要8秒钟,那么这是一个很大的提升。但是唯一可以确定的方法是进行基准测试。

  • 设置环境,以便仅运行必要的工具。 在运行基准测试时不要执行其他任务,因此不会引入任何偏见。

  • 记录序列化一个序列所花费的时间DataTable。多次执行此操作并取平均值。

    var start = DateTime.Now;
    

    // Serialize
    var duration = DateTime.Now - start;

  • 使用不同大小的DataTables进行试验,看看是否找到可接受的时间。

  • 尝试使用其他序列化库,例如JSON.NET。尽管可以很好地保留所有ServiceStack,但这可以帮助您确定这是ServiceStack.Text的不足还是大型数据集的问题。

  • 重复进行反序列化的过程。

记忆:

如果使用大型数据集,那么您的应用程序和缓存是否都具有足够的内存?您的应用程序中的内存可能是瓶颈。在执行操作时,您应该观察系统的活动监视器,并确保您不会耗尽内存并让系统执行分页。如果发现这种情况,请考虑增加RAM或将DataTable分成较小的数据集,如前所述。

潜伏:

如果要通过网络而不是在同一台计算机上连接到Redis服务器,是否检查了网络的延迟?您可能希望在应用程序服务器和缓存服务器之间ping通,并确保您的ping通较低。特别是如果您发现缓存简单对象比较慢。

Redis?

如果您发现无法缩短缓存和还原时间,那么使用Redis可能不是一个很好的选择。也许static DataTable在应用程序内存中使用会更合适。换句话说,通过将缓存保留在应用程序内存中,就不必担心序列化和反序列化了。当然,您可能需要注意确保应用程序有足够的可用内存来执行此操作。
但是,如果您不得不选择此选项,我会感到惊讶

摘要:

最终,如果没有看到您的数据集或对正在构建的服务的了解,最终只会获得关于如何最大程度地缩小问题根源的通用建议。关键建议是,DataTable如果要使用更简单的结构,则不要使用“
a”,而是对每个操作进行基准测试以确定任何瓶颈。

我希望这有帮助。



 类似资料:
  • 本文向大家介绍什么是序列化与反序列化?相关面试题,主要包含被问及什么是序列化与反序列化?时的应答技巧和注意事项,需要的朋友参考一下 序列化:将对象状态转换为可保持或传输的格式的过程。将对象实例的字段及类的名称转换成字节流,然后把字节流写入数据流 反序列化:将流转换为对象。 这两个过程结合起来,可以轻松地存储和传输数据。    

  • 问题内容: 我注意到存储在Redis中的某些序列化对象在反序列化方面遇到问题。 当我对Redis中存储的对象类进行更改时,通常会发生这种情况。 我想了解问题,以便为解决方案设计一个清晰的方案。 我的问题是,什么导致反序列化问题?移除公共/私人财产会引起问题吗?也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢? 在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加

  • 我的Spring Boot API使用camelCase,但我需要通过我的API将一些请求代理到使用snake_case的第三方API。是否可以将Jackson配置为从snake_case反序列化第三方响应,然后将其序列化回camelCase到我的前端? 所需功能的逐步示例: 示例对象: 我调用我的API API调用第三方 第三方返回 我的API将其反序列化为 我的API序列化对象并返回 现在我使

  • 如题目所述,想请教一下大佬们在Java中序列化与反序列化的意义是什么,如何理解Java的序列化和反序列化?

  • FAQs in section [36]: [36.1]“序列化”是什么东东? [36.2] 如何选择最好的序列化技术? [36.3] 如何决定是要序列化为可读的(“文本”)还是不可读的(“二进制”)格式? or non-human-readable ("binary") format?") [36.4] 如何序列化/反序列化数字,字符,字符串等简单类型? [36.5] 如何读/写简单类型为可读的

  • 上一小节我们学习了 Java 的输入输出流,有了这些前置知识点,我们就可以学习 Java 的序列化了。本小节将介绍什么是序列化、什么是反序列化、序列化有什么作用,Serializable 接口以及 Externalizable 接口,常用序列化工具介绍等内容。 1. 序列化与反序列化 序列化在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式,以留待后续在相同或另一台计算机环境中,能