Quel est le principe de la structure des données Redis ?
May 28, 2023 pm 10:26 PMRedisDb
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
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# 🎜🎜# | ptr | Pointeur, occupe 8 octets, pointant vers l'adresse des données |
La commande est l’opération associée sur RedisObject. | ||
object 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#🎜 🎜# | 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ère | Comme vous pouvez le voir, # 🎜🎜#SDS est similaire à la structure ArrayList de Java | Il alloue également une longueur initiale et l'étend lorsque la longueur dépasse. .Redis 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 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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds

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

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

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

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

Lequel a les meilleures performances, erlang ou golang ?
