数据导出优化思路

需求背景:用户需要数据库中的全量数据,数据量较大,此时出现导出时间过长,内存溢出等问题。

业务分析:需分析导出的数据量大小、并发量、数据关联的表的数量、是否需要排序、导出时用户能够容忍的时间。

技术分析:导出时是否会内存溢出、是否占用数据库表锁行锁。

 

优化思路:数据库优化、jvm优化、业务优化、线程优化

 

一:异步发送

1.1 异步邮件发送

当用户需要下载时,需用户填写邮箱地址,由后台导出后发送给用户。

优势: 无需实时发送,可以容忍效率低的导出,实现简单

劣势:降低了用户体验

二:缓存技术

2.1 CSV存储引擎缓存

新建一张数据库表,使用mysql的csv存储引擎,定期更新表数据,用户导出时,直接将csv文件发送给用户。

优势:导出效率高

劣势:需要维护csv的表,选择更新方式

2.2:物化视图缓存

新建一张物化视图,刷新方式为自动刷新+增量刷新,导出时直接单表查询

场景:适用于关联表数较多的导出

2.3:文件缓存

编写定时任务,定时将数据生成excel文件,用户下载时,直接下载缓存的excel文件。

2.4: 数据缓存

将数据缓存至Redis,使用Redission的RList取数据

三:实时性数据导出

3.1 多sheet页的导出

3.1.1 文件拆分

将多sheet页的数据拆分成多个excel文件,每个文件一个sheet页

缺点:降低了用户体验。

3.1.2 多线程

   当sheet页为5个之内,使用线程池,每个sheet页使用一个线程,主线程等待(使 用CountDownLantch实现)所有线程取完数据并使用输出流写入文件后,主线程将文件 流发送给用户

3.1.3 微服务

当sheet页大于5个时,进行服务拆分,将每个sheet页的取数开发成微服务(使用Dubbo或者Eureka实现),主服务负责将数据写入文件流,写完后导出给用户。

 

3.2 单sheet页大数据的导出

3.2.1  多线程

当数据量不是特别多的情况下,使用单机多线程技术,例如,总数据量为100万,分拆五个线程,每个线程20万条数据,同时写入excel中,主线程等待所有其他线程执行完毕后告知用户(使用CountDownLantch实现)。

3.2.1 微服务

将取数据分拆多个服务,使其共同取数据,由主服务写入文件流

3.2.3 分页

为了防止内存溢出,可以选择一次性取出几百条数据后就写入文件流。

例如:实现Mybatis的ResultHandler接口

3.3.4 excel生成优化

  当数据量超过65535行时,无法直接使用Excel打开,建议生成csv文件,导出时使用字符串拼接的方式,效率更高。

 

 

猜你喜欢

转载自blog.csdn.net/qq_31205803/article/details/108577439