最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot數(shù)據(jù)壓縮實(shí)踐方案

 更新時(shí)間:2025年10月09日 08:48:25   作者:請叫我頭頭哥  
文章探討了Redis中處理大key的壓縮方案,包括拆分JSON結(jié)構(gòu)、使用GZIP/Deflater壓縮、優(yōu)化體積(如移除空格、縮短鍵名)、流式處理及分段存儲(chǔ),旨在降低內(nèi)存負(fù)擔(dān)并提升性能,感興趣的朋友跟隨小編一起看看吧

最近在使用Redis的時(shí)候,經(jīng)常遇到一些不常用的大key,對存儲(chǔ)有一些負(fù)擔(dān)。就想著把大key壓縮一下。壓縮可以分很多種,比如拆分JSON字符串?, ??壓縮JSON字符串?,優(yōu)化JSON體積?,流式處理大型JSON?和分段存儲(chǔ)。

拆分JSON字符串?

1.1按結(jié)構(gòu)拆分?

數(shù)組拆分??:若JSON包含大型數(shù)組,可將其拆分為多個(gè)小數(shù)組。

// 示例:將大數(shù)組拆分為多個(gè)子數(shù)組
JSONArray bigArray = new JSONArray(jsonString);
int chunkSize = 100;
for (int i = 0; i < bigArray.length(); i += chunkSize) {
    JSONArray chunk = new JSONArray();
    for (int j = i; j < Math.min(i + chunkSize, bigArray.length()); j++) {
        chunk.put(bigArray.get(j));
    }
    String chunkJson = chunk.toString();
    // 處理或保存chunkJson
}

??對象拆分??:若JSON是嵌套對象,可按層級(jí)拆分為子對象。

1.2按大小拆分(流式處理)??

使用流式API(如Jackson的JsonParser)逐塊讀取JSON內(nèi)容,避免一次性加載到內(nèi)存:

JsonFactory factory = new JsonFactory();
try (JsonParser parser = factory.createParser(new File("large.json"))) {
    while (parser.nextToken() != null) {
        // 逐Token處理,如按特定條件拆分
    }
}

壓縮JSON字符串?

2.1使用GZIP壓縮?

import java.util.zip.GZIPOutputStream;
import java.io.ByteArrayOutputStream;
public static byte[] compress(String data) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length());
    try (GZIPOutputStream gzip = new GZIPOutputStream(bos)) {
        gzip.write(data.getBytes());
    }
    return bos.toByteArray();
}
// 壓縮后的數(shù)據(jù)可用于傳輸或存儲(chǔ)
byte[] compressed = compress(jsonString);

2.2使用Deflater壓縮?

import java.util.zip.Deflater;
public static byte[] deflateCompress(String data) {
    Deflater deflater = new Deflater();
    deflater.setInput(data.getBytes());
    deflater.finish();
    byte[] buffer = new byte[1024];
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    while (!deflater.finished()) {
        int count = deflater.deflate(buffer);
        outputStream.write(buffer, 0, count);
    }
    deflater.end();
    return outputStream.toByteArray();
}

優(yōu)化JSON體積??

3.1移除無用空格?

使用緊湊格式(無縮進(jìn)、換行):

new JSONObject(jsonString).toString(); // 默認(rèn)緊湊格式

3.2??縮短鍵名?

將長字段名替換為短名稱:

{"n":"Alice","a":30} // 原始鍵名可能為"name"、"age"

流式處理大型JSON??

使用流式API逐步解析,避免內(nèi)存溢出:

// Jackson流式API示例
JsonFactory factory = new JsonFactory();
try (JsonParser parser = factory.createParser(new File("large.json"))) {
    JsonToken token;
    while ((token = parser.nextToken()) != null) {
        if (token == JsonToken.START_ARRAY) {
            while (parser.nextToken() != JsonToken.END_ARRAY) {
                // 逐條處理數(shù)組元素
                JsonNode node = parser.readValueAsTree();
                // 處理node...
            }
        }
    }
}

分頁處理?

其實(shí)也是拆分,將數(shù)據(jù)拆成若干份

實(shí)踐方案

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.codec.binary.Base64;
import java.nio.charset.StandardCharsets;
public class CompressHelper {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    /**
     * 方式1:去除JSON中的空格/換行等冗余字符(文本壓縮)
     * @param formattedJson 格式化的JSON字符串(含空格換行)
     * @return 緊湊格式的JSON字符串
     * @throws IOException JSON解析異常
     */
    public static String compressJsonByRemovingSpaces(String formattedJson) throws IOException {
        JsonNode jsonNode = objectMapper.readTree(formattedJson);
        return objectMapper.writeValueAsString(jsonNode);
    }
    /**
     * 方式2:使用GZIP算法對JSON字符串進(jìn)行二進(jìn)制壓縮(適合網(wǎng)絡(luò)傳輸)
     * @param json 原始JSON字符串
     * @return Base64編碼的壓縮后字符串(可直接傳輸)
     * @throws IOException 壓縮異常
     */
    public static String compressJsonByGzip(String json) throws IOException {
        try (ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
             GZIPOutputStream gzipOut = new GZIPOutputStream(byteOut)) {
            gzipOut.write(json.getBytes("UTF-8"));
            gzipOut.finish();
            return Base64.encodeBase64String(byteOut.toByteArray());
        }
    }
    public static String decompressJson(String source) throws IOException {
        byte[] compressedData = Base64.decodeBase64(source);
        try (ByteArrayInputStream byteIn = new ByteArrayInputStream(compressedData);
             GZIPInputStream gzipIn = new GZIPInputStream(byteIn);
             ByteArrayOutputStream byteOut = new ByteArrayOutputStream()) {
            // 讀取壓縮數(shù)據(jù)并解壓縮
            byte[] buffer = new byte[1024];
            int len;
            while ((len = gzipIn.read(buffer)) != -1) {
                byteOut.write(buffer, 0, len);
            }
            return byteOut.toString(StandardCharsets.UTF_8.name());
        }
    }
}

源碼地址

https://github.com/toutouge/javademosecond/tree/master/hellolearn

到此這篇關(guān)于SpringBoot數(shù)據(jù)壓縮實(shí)踐方案的文章就介紹到這了,更多相關(guān)SpringBoot數(shù)據(jù)壓縮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java JDK動(dòng)態(tài)代理的基本原理詳細(xì)介紹

    Java JDK動(dòng)態(tài)代理的基本原理詳細(xì)介紹

    這篇文章主要介紹了Java JDK動(dòng)態(tài)代理的基本原理詳細(xì)介紹的相關(guān)資料,這里對動(dòng)態(tài)代理進(jìn)行了詳解并附簡單實(shí)例代碼,需要的朋友可以參考下
    2017-01-01
  • 淺談Java線程間通信方式

    淺談Java線程間通信方式

    這篇文章主要為大家詳細(xì)介紹了Java線程間的通信方式,以代碼結(jié)合文字的方式來討論線程間的通信,感興趣的朋友可以參考一下
    2021-11-11
  • 詳解java中import的作用

    詳解java中import的作用

    這篇文章主要介紹了java中import作用,import與package機(jī)制相關(guān),這里先從package入手,再講述import以及static import的作用。
    2021-04-04
  • java.lang.InterruptedException異常的問題解決

    java.lang.InterruptedException異常的問題解決

    本文主要介紹了java.lang.InterruptedException異常的問題解決,這種異常通常意味著 Jenkins 任務(wù)在執(zhí)行過程中被中斷,這可能會(huì)導(dǎo)致任務(wù)失敗或中止,下面就來介紹一下解決方法,感興趣的可以了解一下
    2024-07-07
  • 通過AOP攔截Spring?Boot日志并將其存入數(shù)據(jù)庫功能實(shí)現(xiàn)

    通過AOP攔截Spring?Boot日志并將其存入數(shù)據(jù)庫功能實(shí)現(xiàn)

    本文介紹了如何使用Spring Boot和AOP技術(shù)實(shí)現(xiàn)攔截系統(tǒng)日志并保存到數(shù)據(jù)庫中的功能,包括配置數(shù)據(jù)庫連接、定義日志實(shí)體類、定義日志攔截器、使用AOP攔截日志并保存到數(shù)據(jù)庫中等步驟,感興趣的朋友一起看看吧
    2023-08-08
  • java 與web服務(wù)器鏈接的實(shí)例

    java 與web服務(wù)器鏈接的實(shí)例

    這篇文章主要介紹了java 與web服務(wù)器鏈接的實(shí)例的相關(guān)資料,使用net.Socket類sock.getInetAddress()方法獲得與Web服務(wù)器連接,需要的朋友可以參考下
    2017-07-07
  • MyBatis輸入映射和輸出映射的實(shí)現(xiàn)示例

    MyBatis輸入映射和輸出映射的實(shí)現(xiàn)示例

    本文詳細(xì)介紹了MyBatis框架中resultMap的使用,包括其在Java對象與數(shù)據(jù)庫表列映射中的作用,以及如何配置resultMap處理不同情況,具有一定的參考價(jià)值,感興趣的可以了解一下
    2026-04-04
  • IDEA下lombok安裝及找不到get,set的問題的解決方法

    IDEA下lombok安裝及找不到get,set的問題的解決方法

    這篇文章主要介紹了IDEA下lombok安裝及找不到get,set的問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java動(dòng)態(tài)代理分析及理解

    Java動(dòng)態(tài)代理分析及理解

    這篇文章主要介紹了Java動(dòng)態(tài)代理分析及理解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • java單例模式實(shí)現(xiàn)面板切換

    java單例模式實(shí)現(xiàn)面板切換

    這篇文章主要為大家詳細(xì)介紹了java單例模式實(shí)現(xiàn)面板切換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評(píng)論

白水县| 塔河县| 平果县| 长春市| 高密市| 吉安县| 肇源县| 嵩明县| 平果县| 巍山| 麻栗坡县| 盐亭县| 南昌县| 思茅市| 六安市| 中江县| 米易县| 泽库县| 桦川县| 抚顺县| 阿勒泰市| 平塘县| 汉阴县| 凌海市| 尉犁县| 田阳县| 宿迁市| 油尖旺区| 北辰区| 祁阳县| 东乌珠穆沁旗| 建宁县| 库伦旗| 普兰县| 玉山县| 磐石市| 德昌县| 莱西市| 湄潭县| 广德县| 雷波县|