gpt4 book ai didi

.net - 将 DataTable 序列化/反序列化到 Redis 或从 Redis 序列化/反序列化的最省时的方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 06:03:40 24 4
gpt4 key购买 nike

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

最佳答案

不幸的是,在处理大型数据集时,序列化和反序列化结构总是需要时间。 DataTable尤其是 s 是相当复杂的对象,因为它们有行和列,这些行和列通常附加有很多元数据 - 即使它看起来是一个基本表。

DataTable对比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?

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

总结:

在没有看到您的数据集或您正在构建的服务的知识的情况下,它最终只是关于如何最好地缩小问题原因的一般性建议。关键建议是不要使用 DataTable如果可以使用更简单的结构,并对每个操作进行基准测试以确定任何瓶颈。

希望对您有所帮助。

关于.net - 将 DataTable 序列化/反序列化到 Redis 或从 Redis 序列化/反序列化的最省时的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20898534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com