后端大量数据返回,采用数据压缩+分片操作,加快前端响应速度,个人技术总结

本文主要是介绍后端大量数据返回,采用数据压缩+分片操作,加快前端响应速度,个人技术总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 业务场景

场景类似于,可以查看到这段时间内指定的所有物品的运动轨迹,可以进行回放操作。

2. 解决方案

2.1. 在不考虑压缩的情况,可以尽可能减少传输数据的大小

比如

{[{"consDept":"A部门","consDeptCode":"001","provinceScheduleVO":[{"projectTypeCode":"DEngineering","percentSchedule":"100","planStartStatus":"2"},{"projectTypeCode":"Main","percentSchedule":"50","planStartStatus":"2"}, ……]},{"consDept":"B部门","consDeptCode":"002","provinceScheduleVO":[{"projectTypeCode":"DEngineering","percentSchedule":"100","planStartStatus":"1"},{"projectTypeCode":"Main","percentSchedule":"0","planStartStatus":"1"}, ……]}, …… ]};

把consDept属性名改成a,consDeptCode属性名改成b,把projectTypeCode属性名称改成c, ……  切记不要传输前台不需要的属性。

处理后的数据格式为:

{[{"a":"A部门","b":"001","VO":[{"c":"DEngineering","d":"100","e":"2"},{"c":"Main","d":"50","e":"2"}, ……]},{"a":"B部门","b":"002","VO":[{"c":"DEngineering","d":"100","e":"1"},{"c":"Main","d":"0","e":"1"}, ……]}, …… ]};

数据量也减少了

再这基础上还可以进行优化

改成键值对的形式

对于这种数组形式,如果数据格式相对比较简单,没有嵌套的一维数组,甚至可以改成键值对的形式

比如 “a”:["A部门","B部门","C部门"] ,以减少“a”属性名称出现的次数。  

2.2 分片上传

我们这个数据有开始时间和结束时间的设置,我们就可以知道结束时间,自动就可以获取到,我们固定时间分片要求是什么呢?要求就是倍数的要求,从当前时间开始,以一小时作为一次分割快,最后如果不足1h,则直接获取就行。这样子也可以优化

2.3 后端数据压缩

考虑到数据带宽的问题,我们组长选择后端数据压缩的解决方案

后端使用压缩

协议是:http的请求头 Accept-Encoding:gzip,

你需要将数据转换为字节数组,然后使用GZIPOutputStream对其进行压缩

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;public class DataCompressor {public static byte[] compressData(String jsonData) throws IOException {ByteArrayOutputStream outputStream = new ByteArrayOutputStream();try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream)) {gzipOutputStream.write(jsonData.getBytes("UTF-8"));}return outputStream.toByteArray();}
}

接着实现将压缩后的数据作为HTTP响应体发送,并设置相应的Content-Encoding头部。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;@RestController
public class DataController {@GetMapping("/compressedData")public void getCompressedData(HttpServletResponse response) throws IOException {// 假设这是你的大量JSON数据String jsonData = "{\"large\": \"data\", ...}";// 压缩数据byte[] compressedData = DataCompressor.compressData(jsonData);// 设置响应头response.setHeader("Content-Encoding", "gzip");response.setContentType("application/json");response.setContentLength(compressedData.length);// 将压缩数据写入响应体response.getOutputStream().write(compressedData);}
}

这篇关于后端大量数据返回,采用数据压缩+分片操作,加快前端响应速度,个人技术总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038713

相关文章

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n