文章目录

  • 业务背景
  • 问题分析
  • 方案对比
  • 最终解决方案

业务背景

在系统中有这么一个场景,前台页面上有这么一些数据,其中检测结果是通过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);}}

怎么写一个高性能的导出接口相关推荐

  1. 手写一个获取验证码的接口,超级简单

    手写一个获取验证码的接口,超级简单,觉得有用就试试吧,话不多说代码附上 private static final int VERIFY_CODE_HEIGHT = 25; //验证码高度private ...

  2. 使用Node.js写一个简单的api接口

    引入Http模块 默认你已经安装了Node.js Node当中内置了Http模块: 可以使用 var http= require("http"); 复制代码 引入http模块: H ...

  3. 写一个高性能的敏感词检测组件

    最近写了一个高性能的敏感词检测组件[ToolGood.Words]. 一.高性能,它的效率到底有多快? 如果将正则表达式的算法效率设为1,高性能可达到正则表达式的1.5万倍. 二.选一个巧妙的算法: ...

  4. 用现代 C++ 写一个高性能的服务器

    2019独角兽企业重金招聘Python工程师标准>>> 本文由 伯乐在线 - 袁欣 翻译,艾凌风 校稿.未经许可,禁止转载! 英文出处:James Perry.欢迎加入翻译组. 首先 ...

  5. 用Python写一个简单的api接口

    python框架有很多,例如:Flask,Django,FastAPI 等.本文将使用 Flask 来编写 API 接口. 安装Flask 首先,您需要安装 Flask: pip install fl ...

  6. java usb_用java写一个万能的USB接口(10)

    23.这是java的USB万能接口的源代码可以直接进行编译运行,希望大家能够从中 获益良多(下面每一个package都是一个独立的java类文件,需要单独复制存放) .package io; publ ...

  7. 如何用Netty写一个高性能的分布式服务框架?

    byte[] -->堆外内存 / 堆外内存--> byte[] -->java对象. 优化:省去 byte[] 环节,直接 读/写 堆外内存,这需要扩展对应的序列化框架. Strin ...

  8. 写一个高性能的服务器,C++编写高性能服务器实例教程.pdf

    C++编编写写高高性性能能服服务务器器实实例例教教程程 我将展示如何使用现代C++编写一个Echo服务器,相当于分布式 统开发中的"Hello World".这个服务器会将接收的消 ...

  9. PHP+PHPQRcode写一个二维码接口api

    首先推荐一下phpqrcode这个插件,对于php开发要使用到二维码功能非常实用 PHPqrcode 下载链接放在这了 前端index.php 调用api的方式:域名/index.php?text=内 ...

最新文章

  1. 3软件测试原理与软件缺陷
  2. 【数据科学系统学习】机器学习算法 # 西瓜书学习记录 [6] 朴素贝叶斯实践
  3. Flutter开发之布局-1-Column(15)
  4. 软件测试集成测试广度,软件测试的规范[6]
  5. Oracle 备份与恢复学习笔记(6_1)
  6. Win10怎么设置虚拟内存?
  7. 利用ASP.NET向服务器上传文件[转]
  8. No-3.Linux 终端命令格式
  9. React开发(210):react中try...catch..
  10. 线程池与Callable更配哦
  11. php 远程下载大文件,php下载远程文件(支持断点续传,支持超大文件)
  12. servlet的应用------request对象和bean实体的反射关系
  13. 深入研究java.lang.Runtime类,Process类
  14. 微信小程序制作家庭记账本之一
  15. ListView的item监听事件,并且把值传递给另一个activity
  16. ElasticSearch学习总结2(基础查询)
  17. 时钟芯片S35390A
  18. Layui 后台管理模板 【Y-Admin】
  19. Ubuntu18.04调整屏幕分辨率至1920*1080
  20. Matlab中的ismember和contains傻傻分不清

热门文章

  1. c语言教程在线阅读,《C语言基础教程》.doc
  2. java编程培训学习的就业前景好不好
  3. 定义序列化器时的read_only和write_only选项
  4. 批处理设置windows防火墙协议规则
  5. 计算机控制 根轨迹,五计算机实时控制系统的设计根轨迹法PPT课件
  6. let和const以及箭头函数
  7. 区块链投资分歧:蔡文胜麦刚入局 朱啸虎张颖看衰
  8. 计算机专业c语言用的软件,计算机C语言模拟练习
  9. python完成梅花易数排盘程序
  10. 机器学习排序算法:RankNet to LambdaRank to LambdaMART