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

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);
    }
}

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值