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

 慌瓜 发布于 2023-02-06 19:33

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

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

    DataTablevs 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;
    

    尝试不同大小的DataTables,看看你是否找到了可接受的时间.

    尝试使用其他序列化库,例如JSON.NET.尽管保留所有ServiceStack很好,但这可以帮助您确定它是ServiceStack.Text的缺点还是只是大数据集的问题.

    重复该过程以进行反序列化.

    记忆:

    如果您正在处理大型数据集,那么您的应用程序和缓存都有足够的内存吗?应用程序中的内存可能是瓶颈; 您应该在执行操作时查看系统的活动监视器,并确保您的内存不足并使系统执行分页.如果发现这种情况,可以考虑增加RAM,或者将DataTable拆分为更小的数据集,如前所述.

    潜伏:

    如果您通过网络而不是在同一台计算机上连接到Redis服务器,是否已检查网络的延迟?您可能希望在应用程序服务器和缓存服务器之间执行ping操作,并确保实际上具有较低的ping.特别是如果你发现缓存简单的对象很慢.

    Redis的?

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

    摘要:

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

    我希望这有帮助.

    2023-02-06 19:35 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有