Table des matières
Définition de la structure du dictionnaire
Hash collision et algorithme de hachage
Algorithme de hachage
processus reHash
Opérations sur les tables de hachage pendant la période de rehachage
Maison base de données Redis Une brève discussion sur le dictionnaire, l'algorithme de hachage et le principe ReHash dans Redis

Une brève discussion sur le dictionnaire, l'algorithme de hachage et le principe ReHash dans Redis

Nov 05, 2021 am 10:31 AM
redis 哈希 字典

Cet article vous fera comprendre le dictionnaire, l'algorithme de hachage et le principe ReHash dans Redis. J'espère qu'il vous sera utile !

Une brève discussion sur le dictionnaire, l'algorithme de hachage et le principe ReHash dans Redis

Les dictionnaires de Redis sont largement utilisés pour implémenter diverses fonctions de Redis, notamment des bases de données et des clés de hachage.

L'implémentation sous-jacente du dictionnaire est une table de hachage. Chaque dictionnaire a deux tables de hachage, l'une est utilisée normalement et l'autre est utilisée lorsque le rehash est utilisé pour étendre l'espace. [Recommandations associées : Tutoriel vidéo Redis]

Définition de la structure du dictionnaire

typedef struct dict {
	
	// 类型特定函数
	dictType *type;
	
	// 私有数据
	void *privdata;
	
	// 哈希表,两个元素
	dictht ht[2]
	
	// rehash时记录的索引下标,当没有rehash时,值为-1
	int rehashidx;

} dict;
Copier après la connexion

==Lors d'un rehash, les données d'entrée de chaque index migré par rehashidx seront + 1 ;==

Parmi eux, la table de hachage La structure de dicttht est définie comme :

typedef struct dictht {
	
	// 哈希表数组
	dictEntry **table;
	
	// 哈希表大小
	unsigned long size;
	
	// 哈希表大小掩码,用于计算索引值
	unsigned long sizenask;
	
	// 该哈希表已有节点的数量
	unsigned long uesd;

} dictht;
Copier après la connexion

Parmi eux, table est un tableau, chaque élément du tableau pointe vers un pointeur de type dictEntry et le type dictEntry stocke une paire clé-valeur.

On peut également voir ici que les nœuds de la table de hachage sont connectés par des listes chaînées pour résoudre le problème de conflit de hachage, qui est la méthode d'adresse en chaîne.

Hash collision et algorithme de hachage

Afin d'obtenir un accès rapide de la clé à la valeur, Redis utilise une table de hachage pour enregistrer toutes les paires clé-valeur. La key correspond à la Key définie par Redis, et la valuene correspond pas à la valeur elle-même, mais au pointeur pointant vers la valeur spécifique. Le plus grand avantage de l’utilisation d’une table de hachage est que vous pouvez trouver rapidement des paires clé-valeur avec une complexité temporelle O(1). Mais comme il s'agit d'une table de hachage, il y aura forcément un problème de conflit de hachage.

Le conflit de hachage signifie que lorsque la valeur de hachage de deux clés et du compartiment de hachage sont calculées, elles tombent sur le même compartiment de hachage.

La façon dont Redis résout les conflits de hachage consiste à utiliser le hachage en chaîne, qui est la méthode zippé. Lorsque plusieurs éléments pointent vers le même compartiment de hachage, une liste chaînée est utilisée pour enregistrer les données correspondantes dans le même compartiment de hachage, et ils sont connectés à leur tour à l'aide de pointeurs.

Algorithme de hachage

Lorsqu'une nouvelle paire clé-valeur est ajoutée au dictionnaire, le programme doit d'abord calculer la valeur de hachage et la valeur d'index en fonction de la paire clé-valeur, puis en fonction de la valeur d'index, la la nouvelle clé sera incluse. Le nœud de table de hachage de la paire de valeurs est placé à l'index spécifié dans le tableau de table de hachage.

processus reHash

Il existe un facteur de charge dans la table de hachage pour contrôler le nombre de paires clé-valeur enregistrées dans la table de hachage. Cela nécessite une opération de répétition pour terminer. Parmi eux, la formule de calcul du facteur de charge est :

// 负载因子 = 哈希表已保存的节点数量 / 哈希表大小
load_factor = ht[0].used / ht[0].size
Copier après la connexion

Les conditions d'expansion et de contraction de la table de hachage sont les suivantes :

  • Le serveur n'exécute pas actuellement la commande BGSAVE ou la commande BGREWRITEAOF, et le facteur de charge du hachage la table est supérieure ou égale à 1 ;
  • Serveur La commande BGSAVE ou la commande BGREWRITEAOF est en cours d'exécution et le facteur de charge de la table de hachage est supérieur ou égal à 5 ; atteint, le processus de répétition sera exécuté.
Si le serveur exécute BGSAVE ou BGREWRITEAOF, Redis créera un processus enfant du processus serveur actuel

Le processus de rehachage est grossièrement divisé en trois étapes :

Allouer un espace plus grand à la table de hachage 2, par exemple, le hachage actuel Deux fois la taille de la table de hachage 1 ;
  • remapper et copier les données de la table de hachage 1 vers la table de hachage 2 ;
  • libérer l'espace de la table de hachage 1 ; La taille de l'espace d'allocation d'étape est déterminée par le type d'opération de rehachage actuel et le nombre de paires clé-valeur dans la table de hachage actuelle.
  • Lorsqu'une opération d'expansion est effectuée, la taille de l'espace alloué est la première valeur 2^n supérieure ou égale à (le nombre de paires clé-valeur dans la table de hachage * 2) 
Supposons que le ; le nombre actuel de paires clé-valeur est 4 , alors 4 * 2 = 8, car 8 est exactement égal à 2^3, ce qui est exactement égal à la première valeur égale à 2^n, donc l'espace d'expansion est 8 ;

  • Si une opération de réduction est effectuée, l'espace alloué La taille est la première valeur 2^n supérieure ou égale à (le nombre de paires clé-valeur dans la table de hachage) ;

    Lorsque le nombre de tables de hachage est important, si toutes les données sont copiées en même temps, cela risque très probablement d'affecter le serveur. Par conséquent, Redis effectue une répétition plusieurs fois, ce qui est une répétition progressive.在 En termes simples, dans la deuxième étape, Redis gère toujours la demande du client normalement Chaque fois qu'une demande est traitée, à partir de la première position d'index dans la table de hachage 1 L'élément d'entrées est copié dans la table de hachage 2 ; effectuée, les entrées à la position d'index suivante sont copiées. De cette façon, il copie intelligemment la surcharge d'un grand nombre de copies à la fois, qui est appliquée au processus de demandes de traitement multiples, évitant ainsi les opérations fastidieuses et garantissant un accès rapide aux données.

    Opérations sur les tables de hachage pendant la période de rehachage

    Pendant l'opération de rehachage progressif, la suppression du dictionnaire, la recherche, la mise à jour et d'autres opérations seront effectuées dans deux tables de hachage. Par exemple, si vous souhaitez rechercher une clé dans le dictionnaire, vous l'interrogerez d'abord dans la table d'origine. S'il ne la trouve pas, vous l'interrogerez dans la nouvelle table. L'ajout du dictionnaire ne sera conservé que dans le nouveau tableau.

    Pour plus de connaissances sur la programmation, veuillez visiter :

    Introduction à la programmation

     ! !

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

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)

Comment construire le mode Cluster Redis Comment construire le mode Cluster Redis Apr 10, 2025 pm 10:15 PM

Le mode Redis Cluster déploie les instances Redis sur plusieurs serveurs grâce à la rupture, à l'amélioration de l'évolutivité et de la disponibilité. Les étapes de construction sont les suivantes: Créez des instances de redis étranges avec différents ports; Créer 3 instances Sentinel, Moniteur Redis Instances et basculement; Configurer les fichiers de configuration Sentinel, ajouter des informations d'instance Redis de surveillance et des paramètres de basculement; Configurer les fichiers de configuration d'instance Redis, activer le mode de cluster et spécifier le chemin du fichier d'informations de cluster; Créer un fichier nœuds.conf, contenant des informations de chaque instance redis; Démarrez le cluster, exécutez la commande CREATE pour créer un cluster et spécifiez le nombre de répliques; Connectez-vous au cluster pour exécuter la commande d'informations de cluster pour vérifier l'état du cluster; faire

Comment utiliser la commande redis Comment utiliser la commande redis Apr 10, 2025 pm 08:45 PM

L'utilisation de la directive Redis nécessite les étapes suivantes: Ouvrez le client Redis. Entrez la commande (Verbe Key Value). Fournit les paramètres requis (varie de l'instruction à l'instruction). Appuyez sur Entrée pour exécuter la commande. Redis renvoie une réponse indiquant le résultat de l'opération (généralement OK ou -err).

Comment effacer les données redis Comment effacer les données redis Apr 10, 2025 pm 10:06 PM

Comment effacer les données Redis: utilisez la commande flushall pour effacer toutes les valeurs de clé. Utilisez la commande flushdb pour effacer la valeur clé de la base de données actuellement sélectionnée. Utilisez SELECT pour commuter les bases de données, puis utilisez FlushDB pour effacer plusieurs bases de données. Utilisez la commande del pour supprimer une clé spécifique. Utilisez l'outil Redis-CLI pour effacer les données.

Comment utiliser un seul fileté redis Comment utiliser un seul fileté redis Apr 10, 2025 pm 07:12 PM

Redis utilise une architecture filetée unique pour fournir des performances élevées, une simplicité et une cohérence. Il utilise le multiplexage d'E / S, les boucles d'événements, les E / S non bloquantes et la mémoire partagée pour améliorer la concurrence, mais avec des limites de limitations de concurrence, un point d'échec unique et inadapté aux charges de travail à forte intensité d'écriture.

Comment lire le code source de Redis Comment lire le code source de Redis Apr 10, 2025 pm 08:27 PM

La meilleure façon de comprendre le code source redis est d'aller étape par étape: familiarisez-vous avec les bases de Redis. Sélectionnez un module ou une fonction spécifique comme point de départ. Commencez par le point d'entrée du module ou de la fonction et affichez le code ligne par ligne. Affichez le code via la chaîne d'appel de fonction. Familiez les structures de données sous-jacentes utilisées par Redis. Identifiez l'algorithme utilisé par Redis.

Comment afficher toutes les clés dans Redis Comment afficher toutes les clés dans Redis Apr 10, 2025 pm 07:15 PM

Pour afficher toutes les touches dans Redis, il existe trois façons: utilisez la commande Keys pour retourner toutes les clés qui correspondent au modèle spécifié; Utilisez la commande SCAN pour itérer les touches et renvoyez un ensemble de clés; Utilisez la commande info pour obtenir le nombre total de clés.

Comment implémenter le redis sous-jacent Comment implémenter le redis sous-jacent Apr 10, 2025 pm 07:21 PM

Redis utilise des tables de hachage pour stocker les données et prend en charge les structures de données telles que les chaînes, les listes, les tables de hachage, les collections et les collections ordonnées. Redis persiste les données via des instantanés (RDB) et ajoutez les mécanismes d'écriture uniquement (AOF). Redis utilise la réplication maître-esclave pour améliorer la disponibilité des données. Redis utilise une boucle d'événement unique pour gérer les connexions et les commandes pour assurer l'atomicité et la cohérence des données. Redis définit le temps d'expiration de la clé et utilise le mécanisme de suppression paresseux pour supprimer la clé d'expiration.

Comment lire la file d'attente redis Comment lire la file d'attente redis Apr 10, 2025 pm 10:12 PM

Pour lire une file d'attente à partir de Redis, vous devez obtenir le nom de la file d'attente, lire les éléments à l'aide de la commande LPOP et traiter la file d'attente vide. Les étapes spécifiques sont les suivantes: Obtenez le nom de la file d'attente: Nommez-le avec le préfixe de "Fitre:" tel que "Fitre: My-Quyue". Utilisez la commande LPOP: éjectez l'élément de la tête de la file d'attente et renvoyez sa valeur, telle que la file d'attente LPOP: My-Queue. Traitement des files d'attente vides: si la file d'attente est vide, LPOP renvoie NIL et vous pouvez vérifier si la file d'attente existe avant de lire l'élément.

See all articles