我想在Redis中存储复杂的对象,如a DataTable
或Dataset
等.我曾尝试使用它们将它们序列化为BLOB对象JsonSerialize
,但这需要花费太多时间.还有其他方法吗?
不幸的是,在处理大型数据集时,总是需要时间来序列化和反序列化结构.DataTable
尤其是相当复杂的对象,因为它们具有行和列,这些行和列通常附有大量元数据 - 即使它看起来像是基本表.
DataTable
vs List<POCO>
:考虑一下你是否真的需要序列化为DataTable
.你能创建一个更简单的POCO并序列化List<YourRecord>
吗?换句话说,如果您不需要字段和列上的额外属性,并且可以序列化为更简单的格式,则可能更快,并且在缓存中更节省空间; 然后DataTable
在必要时恢复到a .
另一种选择是将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
在应用程序内存中使用a 会更合适.换句话说,通过将缓存保留在应用程序内存中,然后不需要担心序列化和反序列化.当然,您可能需要注意确保应用程序有足够的可用内存来执行此操作.但是,如果你不得不选择这个选项,我会感到惊讶.
如果没有看到您正在构建的数据集或服务知识,最终只会提供有关如何最好地缩小问题原因的通用建议.关键建议是不使用a,DataTable
如果更简单的结构将做,并对每个操作进行基准测试以确定任何瓶颈.
我希望这有帮助.