怎么写一个高性能的导出接口

业务背景

在系统中有这么一个场景,前台页面上有这么一些数据,其中检测结果是通过api调用生成的,每次检测都要调用检测接口。
在这里插入图片描述

现在有个新需求,要导出页面上的数据为excel,也就是如下的导出按钮:

在这里插入图片描述

问题分析

考虑到该页面数据并不是直接通过查询数据库得到,而是由前端输入相应数据后,调用后台检测结果接口生成,如果在调用导出接口时,再次调用后台检测接口,无疑会导致导出接口性能下降,所以笔者通过思考得到以下解决方案:

方案一:
由于数据量不大,前台可以将页面所有数据进行传输到后台,再由后台导出接口直接生成表格后返回;

方案二:
前台在调用后台检测结果接口生成页面后,页面的数据已经是完整的,此时根本无需后台再做数据库之类的操作,可以直接利用开源的生成Excel的工具,前台直接导出;

方案三:
前台在调用后台检测结果接口生成页面后,后台将检测结果存入到redis中,并将redis的key返回给前台,前台将该key存入一个全局变量中,在调用导出接口时,将该全局变量传给后台,后台根据key查找到该缓存数据,将该数据生成表格后返回。

方案对比

方案一可能存在的问题是:在数据量过大的情况下,前台传输数据太多,在传输过程中有丢失的风险;

方案二是由纯js实现的,由于没有试过,对其中存在的风险不予置评,具体实现可以参考这个

方案三中由于采用了缓存,可能出现的问题是:

如果单纯使用一个类似UUID来生成redis的key,不去考虑真实的业务场景,则调用数据生成接口中,前台多次发送相同的数据,却生成了不同的缓存,这显然是不符合业务逻辑的,也会给系统造成很多垃圾数据。

针对这个问题,我的解决方案是:

在调用生成数据接口时,可以考虑在key上加入用户id,再加上特定的“export”字符,以及前台传入的条件,这样大概率就是唯一的redis id,再给前台返回这个key。

由于该数据是临时的,所以必须设置一个过期时间,将过期时间设置为24小时。

最终解决方案

方案一:纯js导出,该方案不需要后台做任何处理,简单易用;具体实现可以参考这个

方案二:即上述方案三,利用redis来提高性能,伪代码如下


public GoodsTypeVO queryAndOperateData(GoodsTypeDTO goodsTypeDTO){
        // 1、queryData from database
        GoodsTypePO goodsTypePO = new GoodsTypePO();
        //2、 operate data
        //3、return data
        GoodsTypeVO goodsTypeVO = new GoodsTypeVO();
        String redisKey = userId + goodsTypeDTO.getGoodsTypeId();
        Int expireTime = 24if (redis.get(redisKey).isEmpty()){
            redis.set(goodsTypeVO,expireTime);
        }
        goodsTypeVO.setRedisKey(redisKey);
        return goodsTypeVO;
    }


    public OutputStream getExcel(String  redisKey){
        List data = redis.get(redisKey).isEmpty();
        if (StringUtils.isEmpty(redisKey)){
            return null;
        }else {
            //excel export
            return Excel.export(data);
        }
    }



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用:Word源码Java问题由来最开始是项目组出现了很多项目文档,这些文档格式不一,可以说是五花八门,故需要一个统一的文档处理工具来方便操作和管理这些文档。Java2word是一个Java程序中调用MS Office Word文档的组件(类库),提供了一组简单的接口,以便进行文档的创建、编辑和导出等操作。 引用:Java作为一种广泛使用的计算机编程语言,具有跨平台性、易于学习和使用、安全性、大量的开源库和框架以及高性能等优点。尽管Java的速度较慢,内存占用较大,难以调试,GUI编程困难等劣势也存在,但是它仍然是开发企业级应用程序的首选语言之一。因此,使用Java一个心形图案是可以实现的。 要使用Java一个心形图案,可以通过绘制图形的方式实现。可以使用Java的图形库,如Java Swing或JavaFX来创建一个窗口,在窗口中绘制一个心形图案。可以通过计算心形曲线上的点的坐标,并连接这些点来实现心形图案的绘制。可以使用循环结构来计算并绘制这些点,从而形成整个心形图案。可以根据具体的需求来调整心形的大小、颜色和位置等参数,以达到所需的效果。 此外,还可以使用Java的文本处理库,如Apache POI,来生成一个心形形状的Word文档。可以使用Java代码创建一个Word文档,设置文档的格式和样式,将文本内容以心形的形状进行排版,并保存为Word文件。这样就可以通过Java程序生成一个包含心形图案的Word文档。 综上所述,要用Java一个心形图案,可以通过图形绘制库或文本处理库来实现,具体的实现方式可以根据需求选择合适的库和算法来完成。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [word源码java-BuildWord:帮我整理word文档的工具](https://download.csdn.net/download/weixin_38506103/19407634)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [java语言的优势和劣势](https://download.csdn.net/download/milk416666/88251355)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [阿里面试失败后,一气之下我图解了Java中18把锁](https://blog.csdn.net/guoguo527/article/details/118004077)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值