Maison  >  Article  >  Comment implémenter les cinq structures de données de Redis au niveau sous-jacent

Comment implémenter les cinq structures de données de Redis au niveau sous-jacent

醉折花枝作酒筹
醉折花枝作酒筹original
2021-07-07 10:38:505790parcourir

Méthode d'implémentation : 1. Chaque structure de données a sa propre implémentation de codage interne sous-jacente, et il existe plusieurs implémentations, de sorte que Redis choisira le codage interne approprié dans le scénario approprié 2. Chaque structure de données a plus de deux types de codage interne ; mise en œuvre ; 3. Le codage interne peut être utilisé comme mise en œuvre interne d’une variété de structures de données externes.

Comment implémenter les cinq structures de données de Redis au niveau sous-jacent

L'environnement d'exploitation de ce tutoriel : système Windows 7, Redis version 5.0.10, ordinateur DELL G3.

Redis a cinq structures de données de base : chaîne, hachage, ensemble, zset et liste. Ce qui suit explique comment la couche inférieure les implémente lors du téléchargement de la version Redis 3.0.6.

Pour résumer

(1) Chaque structure de données a sa propre implémentation de codage interne sous-jacente, et il existe plusieurs implémentations, de sorte que Redis choisira le codage interne approprié dans le scénario approprié.

(2) Vous pouvez voir que chaque structure de données a plus de deux implémentations d'encodage internes. Par exemple, la structure de données de chaîne comprend trois encodages internes : raw, int et embstr.

(3) Dans le même temps, certains encodages internes peuvent être utilisés comme implémentations internes de diverses structures de données externes. Par exemple, ziplist est un encodage interne commun au hachage, à la liste et au zset.

Dynamic String SDS

SDS est l'abréviation de "simple chaîne dynamique". Les chaînes qui apparaissent dans tous les scénarios dans Redis sont essentiellement implémentées par SDS :

  • Toutes les clés non numériques, telles que : key msg in set msg "hello"

  • La valeur du type de données chaîne, par exemple : valeur "hello" dans set msg "hello"

  • "string value" dans les types de données non-chaîne, tels que : "apple" "banana" dans rpush fruits "apple" "banana"

SDS ressemble à ceci :

Comment implémenter les cinq structures de données de Redis au niveau sous-jacent

free : combien d'espace reste-t-il ?

len : longueur de la chaîne

buf : tableau de caractères stocké

Pré-allocation d'espace

Pour réduire la surcharge de mémoire liée à la modification de l'agent de chaîne Comme pour le nombre d'allocations, SDS adopte la stratégie de "gestion unique":

  • Si la longueur du SDS est

  • Si la longueur du SDS est >= 1 Mo après modification, l'extension répondra non seulement à la longueur modifiée, mais disposera également d'un espace supplémentaire de 1 Mo.

Libération d'espace paresseuse

Afin d'éviter les opérations de réallocation de mémoire lors du raccourcissement de chaînes, SDS ne libère pas d'espace immédiatement lorsque les données sont réduites.

int

sont toutes sortes de nombres stockés dans Redis, y compris l'ajout délibéré de ""

set game "111"

Liste chaînée double

Listes chaînées doubles telles que lpush, rpush, lpop, rpop

ressemble à ceci :

Comment implémenter les cinq structures de données de Redis au niveau sous-jacent

est divisé en deux parties :

  • "Partie coordination" : orange
    • head : pointe vers la tête d'une liste spécifique doublement chaînée

    • tail : pointe vers la queue d'une liste doublement chaînée spécifique

    • len : la longueur de la liste doublement chaînée

  • "Implémentation spécifique" : bleu
    • a le prédécesseur pré et le successeur suivant

La liste doublement chaînée se compose de deux structures de données : list et listNode.

Recommandations de didacticiels associées : Tutoriel Redis

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn