什么是将数据表序列化/反序列化到Redis或从Redis反序列化的最有效方法?

时间:2014-01-03 07:15:06

标签: .net c#-4.0 redis servicestack

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

1 个答案:

答案 0 :(得分:5)

不幸的是,在处理大型数据集时,总是需要时间来序列化和反序列化结构。 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的?

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

要点:

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

我希望这会有所帮助。