我想在Redis中存储诸如a
DataTable
或Dataset
等的复杂对象。我尝试使用将它们序列化为BLOB对象JsonSerialize
,但是这花费了太多时间。还有其他办法吗?
不幸的是,使用大型数据集时,序列化和反序列化结构总是很费时间。DataTable
特别是,它们是相当复杂的对象,因为它们具有行和列,这些行和列通常附加有许多元数据-
即使它看起来像是基本表。
DataTable
vs 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;
使用不同大小的DataTable
s进行试验,看看是否找到可接受的时间。
尝试使用其他序列化库,例如JSON.NET。尽管可以很好地保留所有ServiceStack,但这可以帮助您确定这是ServiceStack.Text的不足还是大型数据集的问题。
重复进行反序列化的过程。
如果使用大型数据集,那么您的应用程序和缓存是否都具有足够的内存?您的应用程序中的内存可能是瓶颈。在执行操作时,您应该观察系统的活动监视器,并确保您不会耗尽内存并让系统执行分页。如果发现这种情况,请考虑增加RAM或将DataTable分成较小的数据集,如前所述。
如果要通过网络而不是在同一台计算机上连接到Redis服务器,是否检查了网络的延迟?您可能希望在应用程序服务器和缓存服务器之间ping通,并确保您的ping通较低。特别是如果您发现缓存简单对象比较慢。
如果您发现无法缩短缓存和还原时间,那么使用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. 序列化与反序列化 序列化在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式,以留待后续在相同或另一台计算机环境中,能