将DataTable序列化到Redis或从Redis反序列化DataTable最省时的方法是什么



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

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

DataTableList<POCO>

考虑一下您是否真的需要序列化为DataTable。你能创建一个更简单的POCO并序列化一个List<YourRecord>吗?换言之,如果您不需要字段和列上的额外属性,并且可以序列化为更简单的格式,则可能会更快、更节省缓存空间;然后在必要时恢复到CCD_ 9。

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

基准:

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

  • 设置您的环境,使您只运行必要的工具在运行基准测试时不要执行其他任务,这样就不会引入任何偏见

  • 记录序列化DataTable所需的时间。多次执行此操作并平均。

    var start = DateTime.Now;
    // Serialize
    var duration = DateTime.Now - start;
    
  • 用不同大小的DataTable进行实验,看看你是否找到了一个可以接受的时间。

  • 尝试不同的序列化库,如JSON.NET。虽然保留所有的ServiceStack很好,但这可以帮助您确定这是ServiceStack.Text的缺点,还是只是大数据集的问题。

  • 重复反序列化过程。

内存:

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

延迟:

如果你通过网络连接到Redis服务器,而不是在同一台机器上,你检查过网络的延迟吗?您可能想要在应用程序服务器和缓存服务器之间ping,并确保您的ping实际上很低。尤其是当您发现缓存简单对象很慢时。

Redis

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

摘要:

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

我希望这能有所帮助。

最新更新