项目中免不了要作一些数据导出功能,好比导出前一天的订单记录。涉及导出功能可大可小,根据系统具体的用户量、一天的订单量等状况。今天就讨论一下怎么设计一个合理的导出功能。数据库
这个方案最简单,就只需一个导出接口。这个接口只需实现根据用户条件到数据库查询相关数据,而后在应用程序中生成Execl电子表格,最后经过Response把生成的Execl电子表格回写到客户端便可浏览器
该方案简单,由于是同步导出,因此不适用大量数据导出。若是使用该方案进行大量数据导出的话,存在客户端(浏览器)超时的状况,致使导出失败;由于浏览器与Nginx之间有超时设置。服务器
异步导出通常须要设计三个接口。异步
第一个接口:开启一个线程对进行数据查询,并对查询到的数据进行Execl电子表格读写操做,同步返回导出状态标识;
第二个接口:查询第一个接口的完成状态,若是完成Execl电子表格操做,则返回true;不然返回false;
第三个接口:根据第二个接口返回的状态,若是返回true,就调用下载Execl电子表格;不然返回false的话继续轮询调用第二个接口,直到返回true;ide
这种方案比较耗服务器性能,由于须要第二个接口轮询应用服务器的导出状态,设置一个比较合理的轮询周期显得很是必要。另外,第一种方案和第二种方案都没有对导出的结果进行存库记录,若是要下载一样的数据,要整个流程从新走一遍。这样的话就引出第三种方案。性能
该方案须要一张表和两个接口。线程
表的做用是用来存储谁进行了数据导出,导出的电子表格Execl存放的硬盘目录
第一个接口:开启一个线程对进行数据查询,并对查询到的数据进行Execl电子表格读写操做,最后把电子表格的目录存储到数据库;同步返回成功;
第二个接口:在导出列表中找出导出的记录,而后调用该接口进行Execl电子表格下载;设计
该方案须要额外作一个管理下载记录的界面,进行下载管理;这个方案的最大好处就是对下载操做进行了记录。若是须要对相同的数据导出,只需导出一遍便可。不过增长了存储的空间,不管数据库仍是硬盘,都增长了。blog
在实际项目中使用哪一种方案,根据具体业务场景,具体选择便可。其余文件类型的导出方案也能够参考该文章的方案进行操做。接口