怎么写一个高性能的导出接口
文章目录
- 业务背景
- 问题分析
- 方案对比
- 最终解决方案
业务背景
在系统中有这么一个场景,前台页面上有这么一些数据,其中检测结果是通过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 databaseGoodsTypePO goodsTypePO = new GoodsTypePO();//2、 operate data//3、return dataGoodsTypeVO goodsTypeVO = new GoodsTypeVO();String redisKey = userId + goodsTypeDTO.getGoodsTypeId();Int expireTime = 24;if (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 exportreturn Excel.export(data);}}
怎么写一个高性能的导出接口相关推荐
- 手写一个获取验证码的接口,超级简单
手写一个获取验证码的接口,超级简单,觉得有用就试试吧,话不多说代码附上 private static final int VERIFY_CODE_HEIGHT = 25; //验证码高度private ...
- 使用Node.js写一个简单的api接口
引入Http模块 默认你已经安装了Node.js Node当中内置了Http模块: 可以使用 var http= require("http"); 复制代码 引入http模块: H ...
- 写一个高性能的敏感词检测组件
最近写了一个高性能的敏感词检测组件[ToolGood.Words]. 一.高性能,它的效率到底有多快? 如果将正则表达式的算法效率设为1,高性能可达到正则表达式的1.5万倍. 二.选一个巧妙的算法: ...
- 用现代 C++ 写一个高性能的服务器
2019独角兽企业重金招聘Python工程师标准>>> 本文由 伯乐在线 - 袁欣 翻译,艾凌风 校稿.未经许可,禁止转载! 英文出处:James Perry.欢迎加入翻译组. 首先 ...
- 用Python写一个简单的api接口
python框架有很多,例如:Flask,Django,FastAPI 等.本文将使用 Flask 来编写 API 接口. 安装Flask 首先,您需要安装 Flask: pip install fl ...
- java usb_用java写一个万能的USB接口(10)
23.这是java的USB万能接口的源代码可以直接进行编译运行,希望大家能够从中 获益良多(下面每一个package都是一个独立的java类文件,需要单独复制存放) .package io; publ ...
- 如何用Netty写一个高性能的分布式服务框架?
byte[] -->堆外内存 / 堆外内存--> byte[] -->java对象. 优化:省去 byte[] 环节,直接 读/写 堆外内存,这需要扩展对应的序列化框架. Strin ...
- 写一个高性能的服务器,C++编写高性能服务器实例教程.pdf
C++编编写写高高性性能能服服务务器器实实例例教教程程 我将展示如何使用现代C++编写一个Echo服务器,相当于分布式 统开发中的"Hello World".这个服务器会将接收的消 ...
- PHP+PHPQRcode写一个二维码接口api
首先推荐一下phpqrcode这个插件,对于php开发要使用到二维码功能非常实用 PHPqrcode 下载链接放在这了 前端index.php 调用api的方式:域名/index.php?text=内 ...
最新文章
- 3软件测试原理与软件缺陷
- 【数据科学系统学习】机器学习算法 # 西瓜书学习记录 [6] 朴素贝叶斯实践
- Flutter开发之布局-1-Column(15)
- 软件测试集成测试广度,软件测试的规范[6]
- Oracle 备份与恢复学习笔记(6_1)
- Win10怎么设置虚拟内存?
- 利用ASP.NET向服务器上传文件[转]
- No-3.Linux 终端命令格式
- React开发(210):react中try...catch..
- 线程池与Callable更配哦
- php 远程下载大文件,php下载远程文件(支持断点续传,支持超大文件)
- servlet的应用------request对象和bean实体的反射关系
- 深入研究java.lang.Runtime类,Process类
- 微信小程序制作家庭记账本之一
- ListView的item监听事件,并且把值传递给另一个activity
- ElasticSearch学习总结2(基础查询)
- 时钟芯片S35390A
- Layui 后台管理模板 【Y-Admin】
- Ubuntu18.04调整屏幕分辨率至1920*1080
- Matlab中的ismember和contains傻傻分不清