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