Heim >Datenbank >Redis >So optimieren Sie den Redis-Cache-Speicherplatz

So optimieren Sie den Redis-Cache-Speicherplatz

PHPz
PHPznach vorne
2023-05-27 23:44:061219Durchsuche

Szeneneinstellung

1. Wir müssen POJO im Cache speichern. Die Klasse ist wie folgt definiert direkt, drucken Sie

length=284

**, **Diese Methode ist die einfachste und am häufigsten verwendete Methode. Die spezifischen Daten lauten wie folgt:

{"applyAmount":200.11,"bizInfo":"XX", „checkTime“: „2023-02-02“, „investor“: „ABCD“, „otherTime“: „2023-04-10 17:45:17.717“, „preCheckStatus“: „VERARBEITUNG“, „testQueryTime“: „ 2023- 04-10 17:45:17.717","testStatus="SUCCESS",type":Y",userAmount":1000.00,"userPin":ABCDEFGHIJ",userRate":0.002} Wir haben festgestellt, dass das Obige viele nutzlose Daten enthält und die Attributnamen nicht gespeichert werden müssen.

Verbesserung 1 – Entfernen Sie den Attributnamen wie folgt:

["ERFOLGREICH", "ABCDEFGHIJ", "ABCD", "2023-04-10 17:45:17.717",null,"XX", "2023-04-10 17:45:17.717", 1000,00,0,002,200,11, „Y“, „2023-02-02“, „PROCESSING“]

Wir haben festgestellt, dass es nicht erforderlich ist, Null zu speichern. Das Zeitformat wird in eine Zeichenfolge serialisiert, was zu Daten führt Erweiterung, daher sollten wir bessere Serialisierungstools verwenden.

Verbesserung 2 – Bessere Serialisierungstools verwenden
public class TestPOJO implements Serializable {
    private String testStatus;
    private String userPin;
    private String investor;
    private Date testQueryTime;
    private Date createTime;
    private String bizInfo;
    private Date otherTime;
    private BigDecimal userAmount;
    private BigDecimal userRate;
    private BigDecimal applyAmount;
    private String type;
    private String checkTime;
    private String preTestStatus;
    
    public Object[] toValueArray(){
        Object[] array = {testStatus, userPin, investor, testQueryTime,
                createTime, bizInfo, otherTime, userAmount,
                userRate, applyAmount, type, checkTime, preTestStatus};
        return array;
    }
    
    public CreditRecord fromValueArray(Object[] valueArray){         
        //具体的数据类型会丢失,需要做处理
    }
}

Wählen Sie bessere Serialisierungstools, um eine Feldkomprimierung und ein angemessenes Datenformat zu erreichen. Drucken Sie **Länge = 92, **der Speicherplatz wird im Vergleich zum vorherigen Schritt um 40 % reduziert.

Dies ist ein Teil der Binärdaten, der in Binärform verarbeitet werden muss. Nachdem Sie die Binärdatei in eine Zeichenfolge konvertiert haben, drucken Sie sie wie folgt aus:

��SUCCESS�ABCDEFGHIJ�ABCD� �j�6���XX� �j� 6�� ��?`bM����@i � �Q�Y�2023-02-02�VERARBEITUNG

Als wir dieser Idee folgten und tiefer gruben, stellten wir fest, dass wir den Datentyp manuell auswählen können. Um extremere Optimierungseffekte zu erzielen und sich für die Verwendung kleinerer Datentypen zu entscheiden, werden weitere Verbesserungen erzielt.

Verbesserung 3 – Optimierte Datentypen

Im obigen Anwendungsfall sind die drei Felder testStatus, preCheckStatus und investor tatsächlich Aufzählungszeichenfolgentypen (wie Byte oder Int usw.). Durch das Ersetzen der Zeichenfolge kann zusätzlich Platz gespart werden. Sie können den Typ Long anstelle einer Zeichenfolge verwenden, um checkTime darzustellen, sodass das Serialisierungstool weniger Bytes ausgibt.

TestPOJO pojo = new TestPOJO();
pojo.setApplyAmount(new BigDecimal("200.11"));
pojo.setBizInfo("XX");
pojo.setUserAmount(new BigDecimal("1000.00"));
pojo.setTestStatus("SUCCESS");
pojo.setCheckTime("2023-02-02");
pojo.setInvestor("ABCD");
pojo.setUserRate(new BigDecimal("0.002"));
pojo.setTestQueryTime(new Date());
pojo.setOtherTime(new Date());
pojo.setPreTestStatus("PROCESSING");
pojo.setUserPin("ABCDEFGHIJ");
pojo.setType("Y");

Nach der manuellen Anpassung wurde ein kleinerer Datentyp anstelle des String-Typs verwendet, Drucken

Länge = 69

Verbesserung 4 – ZIP-Komprimierung berücksichtigen

Zusätzlich zu den oben genannten Punkten können Sie auch die Verwendung von The ZIP in Betracht ziehen Wenn der Inhalt groß ist oder sich wiederholt, ist die Wirkung der ZIP-Komprimierung offensichtlich. Wenn der gespeicherte Inhalt ein TestPOJO-Array ist, kann die ZIP-Komprimierung geeignet sein.

Bei Dateien, die kleiner als 30 Byte sind, kann die ZIP-Komprimierung die Dateigröße erhöhen, aber nicht unbedingt die Dateigröße verringern. Bei weniger repetitiven Inhalten lässt sich keine nennenswerte Verbesserung erzielen. Und es gibt CPU-Overhead.

Nach der oben genannten Optimierung ist die ZIP-Komprimierung keine erforderliche Option mehr. Tests auf der Grundlage tatsächlicher Daten sind erforderlich, um den ZIP-Komprimierungseffekt zu bestimmen.

Endlich implementiert

Die oben genannten Verbesserungsschritte spiegeln die Optimierungsideen wider, aber der Deserialisierungsprozess führt zum Verlust von Typen, was umständlicher zu handhaben ist, daher müssen wir auch das Problem der Deserialisierung berücksichtigen.

Wenn das Cache-Objekt vordefiniert ist, können wir jedes Feld vollständig manuell verarbeiten. Daher wird im tatsächlichen Kampf empfohlen, die manuelle Serialisierung zu verwenden, um den oben genannten Zweck zu erreichen, eine verfeinerte Steuerung zu erreichen und den besten Komprimierungseffekt und minimalen Leistungsaufwand zu erzielen.

Sie können sich auf den folgenden msgpack-Implementierungscode beziehen. Bitte packen Sie selbst bessere Tools wie Packer und UnPacker:

System.out.println(JSON.toJSONString(pojo).length());
System.out.println(JSON.toJSONString(pojo.toValueArray()).length());

Szenarioerweiterung

Angenommen, wir speichern Daten für 200 Millionen Benutzer. und jeder Benutzer enthält 40 Felder, die Länge des Feldschlüssels beträgt 6 Byte und die Felder werden separat verwaltet.

Normalerweise denken wir an die Hash-Struktur, und die Hash-Struktur speichert Schlüsselinformationen, die zusätzliche Ressourcen beanspruchen. Gemäß den oben genannten Ideen können Sie eine Liste anstelle einer Hash-Struktur verwenden.

Durch den offiziellen Redis-Tooltest erfordert die Verwendung der Listenstruktur 144 GB Speicherplatz, während die Verwendung der Hash-Struktur 245 GB Speicherplatz erfordert** (Wenn mehr als 50 % der Attribute leer sind, ist ein Test erforderlich, um festzustellen, ob dies der Fall ist immer noch anwendbar)**

Im obigen Fall haben wir mehrere sehr einfache Maßnahmen ergriffen, um den Speicherplatz in Szenarien mit großen Datenmengen und hohen Leistungsanforderungen um mehr als 70 % zu reduzieren , es ist sehr zu empfehlen. :

• Verwenden Sie Arrays anstelle von Objekten (wenn eine große Anzahl von Feldern leer ist, müssen Sie Serialisierungstools verwenden, um Nullen zu komprimieren)

• Verwenden Sie bessere Serialisierungstools

# 🎜 🎜#• Verwenden Sie kleinere Datentypen

• Erwägen Sie die Verwendung einer ZIP-Komprimierung

• und Vergleich sind erforderlich)

Das obige ist der detaillierte Inhalt vonSo optimieren Sie den Redis-Cache-Speicherplatz. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen