我想在Redis中存储复杂的对象,如DataTable
或Dataset
等。我曾尝试使用JsonSerialize
将它们序列化为BLOB对象,但这花费了太多时间。还有别的办法吗?
不幸的是,在处理大型数据集时,序列化和反序列化结构总是需要时间。DataTable
尤其是相当复杂的对象,因为它们有行和列,这些行和列通常附有大量元数据,即使它看起来是一个基本表。
DataTable
与List<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
,并对每个操作进行基准测试以确定任何瓶颈。
我希望这能有所帮助。