GZIPOutputStream- und GZIPInputStream-Datenkomprimierung und -Dekomprimierung

Tipp: Nachdem der Artikel geschrieben wurde, kann das Inhaltsverzeichnis automatisch generiert werden. Informationen zur Generierung finden Sie im Hilfedokument rechts.


Vorwort

Ich habe kürzlich eine Reihe von Leistungsoptimierungen übernommen ...
Ich bin auf eine solche Schnittstelle gestoßen: Alle Teile, die optimiert werden können, wurden optimiert (einschließlich Stapelverarbeitung der Geschäftslogik, Datenvorverarbeitung, Datencaching, Reduzieren von Tabellensuchfeldern, Hinzufügen von Tabellenindizes, usw.).

但是,这个接口里有个外部调用会去查询3000+数据,得到的数据大小约为1.5M,耗时:2s
外部系统接口执行时间为:0.8s
那么就意味着...数据传输消耗了:1s+

解决方法:
外部系统将出参:压缩
自己系统将得到数据:解压
Dadurch wird die Datenübertragungszeit verkürzt

Weitere Aspekte: Reduzieren Sie redundante Felder für die Parameterausgabe

1. Endlich mit der Komprimierung von GZIPOutputStream begonnen

Komprimieren Sie die JSON-Zeichenfolge und verschlüsseln Sie sie anschließend (um die Sicherheit zu gewährleisten).

    public static String getCompressionStr(String jsonStr) throws Exception {
    
    
        
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPOutputStream gos = new GZIPOutputStream(out);

        gos.write(jsonStr.getBytes(StandardCharsets.UTF_8));
        gos.close();

        byte[] encodeBytes = Base64.getEncoder().encode(out.toByteArray());
        return new String(encodeBytes);
   

2. Daten empfangen und GZIPInputStream dekomprimieren

Entschlüsseln Sie die empfangene Zeichenfolge und dekomprimieren Sie sie anschließend

    public static String getDecompressionStr(String compressionStr) throws Exception {
    
    
        byte[] decodedBytes = Base64.getDecoder().decode(compressionStr);
        
        GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(decodedBytes));
        BufferedReader bf = new BufferedReader(new InputStreamReader(gis, StandardCharsets.UTF_8));

        StringBuilder outStr = new StringBuilder();
        String line;

        while ((line = bf.readLine()) != null) {
    
    
            outStr.append(line);
        }

        return StringEscapeUtils.unescapeJava(outStr.toString());
    }

3. Demo testen

****Wichtige Tipps************
1: Denken Sie bei der Überprüfung daran, die Protokolle separat auszudrucken. Das Protokoll ist sehr groß, andernfalls ist es schwierig, die Protokolldaten anzuzeigen.
2: Passen Sie die Einstellung der Idee an -> Editor -> Allgemein -> Konsole
Überschreiben Sie die Puffergröße des Konsolenzyklus auf 10240

public class Demo {
    
    

    public static void main(String[] args) {
    
    
        String jsonStr = getJsonStr();
        System.out.println(jsonStr);
        
        try {
    
    
            String compressionStr = getCompressionStr(jsonStr);
//            System.out.println(compressionStr);

            String decompressionStr = getDecompressionStr(compressionStr);
//            System.out.println(decompressionStr);

            List<User> users = JSONArray.parseArray(decompressionStr, User.class);
            System.out.println(users.get(100));
            System.out.println(users.get(100).getUserId());
            System.out.println(users.get(100).getName());
            System.out.println(users.get(100).getAddress());


        } catch (Exception e) {
    
    
            System.err.println(e.getMessage());
        }
    }
	
	/**
	 * 随便创建10000个对象,userId,name,address
	 **/
    public static String getJsonStr() {
    
    
        List<User> users = new ArrayList<>();
        String address = "让我感到为难的 是挣扎的自由\n" +
                "分别总是在九月 回忆是思念的愁\n" +
                "深秋嫩绿的垂柳 亲吻着我额头\n" +
                "在那座阴雨的小城里 我从未忘记你\n" +
                "成都 带不走的 只有你\n" +
                "和我在成都的街头走一走 喔…\n" +
                "直到所有的灯都熄灭了也不停留";
        for (int i = 0; i < 10000; i++) {
    
    
            users.add(new User((long) (i + 1), "张三" + (i + 1), address));
        }
        return JSONArray.toJSONString(users);
    }

4. Verifizierungsergebnisse

Fügen Sie hier eine Bildbeschreibung ein
1: Die Größe von 10.000 Objekten beträgt 3328 KB.
2: Die komprimierte Größe beträgt 80 KB.
3: Die dekomprimierte Größe beträgt 3328 KB.
4: Nach der Dekomprimierung können die Daten in Objekte konvertiert werden (verschachtelte Objekte werden unterstützt) und normal verwendet werden.

            List<User> users = JSONArray.parseArray(decompressionStr, User.class);

            System.out.println(users.get(100));
            System.out.println(users.get(100).getUserId());
            System.out.println(users.get(100).getName());
            System.out.println(users.get(100).getAddress());
    对应的输出结果为:
    
User(userId=101, name=张三101, address=让我感到为难的 是挣扎的自由
分别总是在九月 回忆是思念的愁
深秋嫩绿的垂柳 亲吻着我额头
在那座阴雨的小城里 我从未忘记你
成都 带不走的 只有你
和我在成都的街头走一走 喔…
直到所有的灯都熄灭了也不停留)

101

张三101

让我感到为难的 是挣扎的自由
分别总是在九月 回忆是思念的愁
深秋嫩绿的垂柳 亲吻着我额头
在那座阴雨的小城里 我从未忘记你
成都 带不走的 只有你
和我在成都的街头走一走 喔…
直到所有的灯都熄灭了也不停留
            

Zusammenfassen

Leistungsoptimierung ist wirklich anstrengend.
Insbesondere das Sandbox-Design des Produktmanagers (es ist unvernünftig, 3.000 Daten auf einmal zu verwenden, um die Funktion zwangsweise zu implementieren). Lassen Sie uns
abschließend über die Optimierungsergebnisse sprechen: Die 12-s-Schnittstelle in der Produktionslinie wurde schließlich auf 2 s reduziert.

Eine weitere Erklärung:
Mit Ausnahme von StringEscapeUtils werden in diesem Artikel nur die mit jdk gelieferten Bibliotheken verwendet.

Aber StringEscapeUtils ist in lang3 veraltet.
Es kann durch common-text import org.apache.commons.text.StringEscapeUtils;
//import org.apache.commons.lang3.StringEscapeUtils; ersetzt werden.

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-text</artifactId>
        <version>1.10.0</version>
    </dependency>

Supongo que te gusta

Origin blog.csdn.net/qq_37700773/article/details/130234173
Recomendado
Clasificación