Heim  >  Artikel  >  Datenbank  >  Was ist das Prinzip der Redis-Datenstruktur?

Was ist das Prinzip der Redis-Datenstruktur?

WBOY
WBOYnach vorne
2023-05-28 22:26:271315Durchsuche

    RedisDb

    Der Redis-Server verfügt standardmäßig über 16 Datenbanken, und eine Datenbank entspricht einer RedisDB-Datenstruktur.

    typedef struct redisDb {
        dict *dict;
        dict *expires;
        dict * blocking_keys;
        dict * ready_keys;
        dict * watched_keys;
        ......
    }
    • dict: Schlüsselraum-Hash-Tabelle, die zum Speichern aller Schlüssel-Wert-Paare verwendet wird

    • expires: Ablaufzeit-Hash-Tabelle, in der die Ablaufzeit von Schlüsseln gespeichert wird 🎜#ready_keys: Entsperrschlüssel und entsprechende Clients, relativ zum blocking_keys-Attribut

    • watched_keys: Überwachungsschlüssel und entsprechende Clients, hauptsächlich für Transaktionen verwendet#🎜 🎜##🎜🎜 #

    • RedisObject
    • Die Schlüsselwerte von Redis sind alle redisObject-Objekte. Jedes Mal, wenn wir ein neues Schlüssel-Wert-Paar in der Redis-Datenbank erstellen, wird ein redisObject generiert Objekt für den Schlüsselnamen und ein redisObject-Objekt für den Schlüsselwert Beschreibung

    • type

    • wird verwendet, um den Typ darzustellen, der Redis entspricht

    String, Liste, Hash, Satz , zset, stream usw. werden durch Aufzählungen dargestellt. Raw, Hashtable, Quicklist, Ziplist, Intset, Skiplist usw., dargestellt durch Aufzählung

    lru24 Bits, kann LFU auswählen oder LRUWenn es sich um LRU handelt, wird die letzte Zugriffszeit angezeigt. Wenn es sich um LFU handelt, werden die oberen 16 Bits verwendet, um die Zugriffszeit auf Minutenebene anzuzeigen, und die niedrigen 8 Bits werden verwendet, um die Zugriffszeit anzuzeigen Geben Sie die Zugriffshäufigkeit an. Je größer die Basis, desto schwieriger ist es, die Zugriffszeit zu erhöhen. (Beiden gemeinsam) Die Zugriffszeit ist ein Modulo einer Zahl, und die aktuelle Zeit ist ebenfalls modulo. Wenn die aktuelle Zeit größer als die Zugriffszeit ist, ist sie die Differenz zwischen den beiden Zahlen Zugriffszeit, es handelt sich um die aktuelle Zeit plus den Modulus und die Zugriffszeit. 🎜🎜#Der Anfangswert ist 1, was in praktischen Anwendungen wenig Referenzbedeutung hat# 🎜🎜#Zeiger, belegt 8 Bytes und zeigt auf die Adresse der Daten Befehl ist die zugehörige Operation für RedisObject. Die Zeichenfolge von Redis heißt SDS (Simple Dynamic String, einfache Zeichenfolge) und entspricht der Schlüssel, nicht ganzzahliger String-Wert
    trpedef struct RedisObject {
        int4 type;
        int4 encoding;
        void *ptr;
        int24 lru;
        int32 refcount;
    }
    . Es weist außerdem eine Anfangslänge zu und erweitert diese, wenn die Länge überschritten wird . Wenn die Länge besonders kurz ist, verwenden Sie zum Speichern das Embstr-Formular. Wenn die Länge 44 Bytes überschreitet, verwenden Sie zum Speichern das Rohformat. Es ist bekannt, dass die maximale Zuordnungseinheit des Speicherzuweisers 64 Bytes beträgt, RedisObject 16 Bytes belegt, die SDS-ID 3 Bytes belegt und eine Zeichenfolge, die mit NULL endet, ein Byte benötigt, also wenn das Zeichen Wenn die Zeichenfolgenlänge kleiner oder gleich 44 ist, muss der Speicher nur einmal zugewiesen werden. RedisObject und SDS befinden sich in derselben Speichereinheit. Wir nennen diese Datenstruktur Embstr, während diejenigen, die sich nicht in derselben Speichereinheit befinden, als Raw bezeichnet werden. dictdict (Codierung ist Hashtabellentyp, Wörterbuch) entsprechend der Hash-, Set- und Zset-Sammlung (wird zum Speichern der Zuordnung zwischen Wert und Punktzahl verwendet). dict ähnelt der HashMap-Struktur von Java , der Unterschied besteht darin, dass die HashMap-Erweiterung auf ein Array angewendet, dann durchlaufen, die alten Daten erneut gehasht und untergehängt werden soll Das Array als einzelner Thread Es ist für Redis schwierig, einem so zeitaufwändigen Prozess standzuhalten. Daher verwendet es zwei Arrays, kehrt zuerst zurück und verschiebt die Daten dann Stück für Stück, wenn sie frei sind Die Daten werden gelöscht. Wir nennen diesen Vorgang #🎜 🎜#gradualrehash
    config set maxmemory-policy volatile-lfu # 修改内存淘汰策略
    set name zhangsan
    object freq name # 获取计数值,仅lfu模式下可用,初始化为5
    
    get name
    
    object freq name # 再次访问,返回为6
    ptr
    dict, läuft ab usw., Zeiger zeigen auf dieselbe Adresse
    Ändern Sie die Speichereliminierungsstrategie Objekt-Leerlaufzeitschlüssel # Gibt die Leerlaufzeit des Schlüssels zurück, was eine ungefähre Beschreibung der Zeit seit dem letzten Lesen des Schlüssels ist geschrieben. Es ist im LFU-Modus nicht verfügbar int-Typ und ptr zeigen direkt auf die int-Typ-Adresse embstr und raw
    Wie Sie sehen können, ähnelt # 🎜🎜#SDS der ArrayList-Struktur von JavaRedis legt fest, dass die Länge der Zeichenfolge 512 MB nicht überschreiten darf.
    .

    Das obige ist der detaillierte Inhalt vonWas ist das Prinzip der Redis-Datenstruktur?. 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