Maison  >  Article  >  base de données  >  Quel est le principe de la structure des données Redis ?

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

WBOY
WBOYavant
2023-05-28 22:26:271315parcourir

    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;
        ......
    }
    • 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;
    }
    embstr et raw
    config set maxmemory-policy volatile-lfu # 修改内存淘汰策略
    set name zhangsan
    object freq name # 获取计数值,仅lfu模式下可用,初始化为5
    
    get name
    
    object freq name # 再次访问,返回为6
    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érations encoding
    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# 🎜🎜#
    int Lorsque 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; // 数组内容
    }

    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:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer