Table des matières
RedisDb
dict est similaire à la structure HashMap de Java
Maison base de données Redis Quel est le principe de la structure des données Redis ?

Quel est le principe de la structure des données Redis ?

May 28, 2023 pm 10:26 PM
redis

    RedisDb

    Le serveur Redis dispose de 16 bases de données par défaut, et une base de données correspond à une structure de données RedisDB.

    typedef struct redisDb {
        dict *dict;
        dict *expires;
        dict * blocking_keys;
        dict * ready_keys;
        dict * watched_keys;
        ......
    }
    Copier après la connexion
    • dict : table de hachage de l'espace clé, utilisée pour stocker toutes les paires clé-valeur

    • expire : expires Table de hachage Time, stockant le délai d'expiration des clés

    • blocking_keys : clés en état de blocage et client correspondant

    • #🎜 🎜#ready_keys : Clés de déblocage et clients correspondants, relatifs à l'attribut blocking_keys

    • watched_keys : clés de surveillance et clients correspondants, principalement utilisés pour les transactions#🎜 🎜##🎜🎜 #

      RedisObject
    Les valeurs clés de Redis sont toutes des objets redisObject Chaque fois que nous créons une nouvelle paire clé-valeur dans la base de données Redis, cela générera un redisObject. objet pour le nom de la clé et un objet redisObject pour la valeur de la clé Description

    type est utilisé pour représenter le type correspondant à RedisInternal encoding24 bits, peut sélectionner LFU ou LRUptrPointeur, occupe 8 octets, pointant vers l'adresse des données dict, expire, etc., pointeurs pointant vers la même adresse La commande est l’opération associée sur RedisObject. Modifier la stratégie d'élimination de la mémoireobject Idletime Key # Renvoie le temps d'inactivité de la clé, qui est une description approximative du temps écoulé depuis la dernière fois que la clé a été lue et écrit Il n'est pas disponible en mode lfu#🎜 🎜#
    trpedef struct RedisObject {
        int4 type;
        int4 encoding;
        void *ptr;
        int24 lru;
        int32 refcount;
    }
    Copier après la connexion
    embstr et raw
    config set maxmemory-policy volatile-lfu # 修改内存淘汰策略
    set name zhangsan
    object freq name # 获取计数值,仅lfu模式下可用,初始化为5
    
    get name
    
    object freq name # 再次访问,返回为6
    Copier après la connexion
    Il alloue également une longueur initiale et l'étend lorsque la longueur dépasse. . Lorsque la longueur est particulièrement courte, utilisez le formulaire embstr pour stocker ; lorsque la longueur dépasse 44 octets, utilisez le formulaire brut pour stocker.
    string, List, hash, set , zset, stream, etc. sont représentés par des énumérationsencoding
    int, embstr, raw, hashtable, quicklist, ziplist, intset, skiplist, etc., représentés par l'énumération lru
    Quand c'est LRU, il indique le dernier temps d'accès ; quand c'est LFU, les 16 bits forts sont utilisés pour indiquer le temps d'accès au niveau minute, et les 8 bits bas sont utilisés pour indiquer la fréquence d'accès. Fréquence L'augmentation utilise un algorithme probabiliste. Plus la base est grande, plus il est difficile d'augmenter lorsque le temps d'accès est mis à jour, il y a une certaine probabilité que la fréquence d'accès soit atténuée. (Commun aux deux) L'heure d'accès est un modulo d'un nombre, et l'heure actuelle est également modulo. Si l'heure actuelle est supérieure à l'heure d'accès, c'est la différence entre les deux nombres si l'heure actuelle est inférieure à l'heure actuelle. temps d'accès, c'est l'heure actuelle plus le module et le temps d'accès. 🎜🎜#La valeur initiale est 1, ce qui a peu de signification de référence dans les applications pratiques# 🎜🎜#
    intLorsque la valeur de la chaîne est un entier et est inférieure ou égale à la valeur maximale de long, l'encodage est int type, et ptr pointe directement vers l'adresse de type int
    La chaîne de Redis s'appelle SDS (Simple Dynamic String, simple string), correspondant au clé, valeur de chaîne non entièreComme vous pouvez le voir, # 🎜🎜#SDS est similaire à la structure ArrayList de JavaRedis stipule que la longueur de la chaîne ne peut pas dépasser 512M.

    On sait que l'unité d'allocation maximale de l'allocateur de mémoire est de 64 octets, RedisObject occupe 16 octets, l'identifiant SDS occupe 3 octets et une chaîne se terminant par NULL nécessite un octet, donc lorsque le caractère Lorsque la longueur de la chaîne est inférieure ou égale à 44, la mémoire ne doit être allouée qu'une seule fois. RedisObject et SDS sont dans la même unité de mémoire. Nous appelons cette structure de données embstr, tandis que celles qui ne sont pas dans la même unité de mémoire sont appelées raw. object

    dict

    dict (l'encodage est de type hashtable, dictionnaire) correspondant à la collection hash, set, zset (utilisé pour stocker le mappage entre valeur et score).

    dict est similaire à la structure HashMap de Java

    , la différence est que l'expansion de HashMap consiste à postuler pour un tableau, puis à parcourir, à re-hacher les anciennes données et à les suspendre sous le tableau en tant que thread unique Il est difficile pour Redis de supporter un processus aussi long, il utilise donc deux tableaux, renvoie d'abord, puis déplace les données petit à petit lorsqu'elles sont libres. Une fois le déplacement terminé, l'ancien. les données sont effacées. Nous appelons ce processus #🎜 🎜#gradualrehash

    .

    trpedef struct SDS {
        int8 capacity; // 数组容量
        int8 len; // 实际长度
        int8 flags;
        byte[] content; // 数组内容
    }
    Copier après la connexion

    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 de ce site Web
    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

    Article chaud

    Combien de temps faut-il pour battre Split Fiction?
    3 Il y a quelques semaines By DDD
    Repo: Comment relancer ses coéquipiers
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island Adventure: Comment obtenir des graines géantes
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
    1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

    Article chaud

    Combien de temps faut-il pour battre Split Fiction?
    3 Il y a quelques semaines By DDD
    Repo: Comment relancer ses coéquipiers
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island Adventure: Comment obtenir des graines géantes
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
    1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

    Tags d'article chaud

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    Éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

    Logiciel d'édition de code au niveau de Dieu (SublimeText3)

    Solution à l'erreur 0x80242008 lors de l'installation de Windows 11 10.0.22000.100 Solution à l'erreur 0x80242008 lors de l'installation de Windows 11 10.0.22000.100 May 08, 2024 pm 03:50 PM

    Solution à l'erreur 0x80242008 lors de l'installation de Windows 11 10.0.22000.100

    Comment changer le mot de passe dans Redis Comment changer le mot de passe dans Redis Apr 20, 2024 am 03:00 AM

    Comment changer le mot de passe dans Redis

    Analyser les goulots d'étranglement des fonctions PHP et améliorer l'efficacité de l'exécution Analyser les goulots d'étranglement des fonctions PHP et améliorer l'efficacité de l'exécution Apr 23, 2024 pm 03:42 PM

    Analyser les goulots d'étranglement des fonctions PHP et améliorer l'efficacité de l'exécution

    Redis est-il un cache mémoire ? Redis est-il un cache mémoire ? Apr 20, 2024 am 05:26 AM

    Redis est-il un cache mémoire ?

    Stratégie de mise en cache et optimisation de l'API Golang Stratégie de mise en cache et optimisation de l'API Golang May 07, 2024 pm 02:12 PM

    Stratégie de mise en cache et optimisation de l'API Golang

    Redis est-il une base de données non relationnelle ? Redis est-il une base de données non relationnelle ? Apr 20, 2024 am 05:36 AM

    Redis est-il une base de données non relationnelle ?

    Mécanisme de mise en cache et pratique d'application dans le développement PHP Mécanisme de mise en cache et pratique d'application dans le développement PHP May 09, 2024 pm 01:30 PM

    Mécanisme de mise en cache et pratique d'application dans le développement PHP

    Lequel a les meilleures performances, erlang ou golang ? Lequel a les meilleures performances, erlang ou golang ? Apr 21, 2024 am 03:24 AM

    Lequel a les meilleures performances, erlang ou golang ?

    See all articles