Cet article vous amènera à comprendre le type String dans la structure de données Redis et à parler de la structure de stockage KV de Redis. J'espère qu'il vous sera utile !
Redis est souvent utilisé comme cache KV distribué. Beaucoup de gens l'utilisent uniquement, mais ils ne savent pas qu'il y a de nombreux secrets inconnus en dessous. [Recommandations associées : Tutoriel vidéo Redis]
String est le type de données le plus basique pris en charge par Redis. Tout d'abord, examinons String, sa structure de données et son stockage.
Comme nous le savons tous, redis est écrit en langage C, et le langage C n'a pas de type String, seulement char[], et la taille doit être spécifiée lors de l'initialisation et ne peut pas être modifiée. Afin de réaliser des fonctions telles que l'ajout et l'expansion dynamiques, telles que la commande incr et la commande append, redis définit et maintient un SDS (Simple Dynamic String) pour implémenter ces fonctions.
Jetons d'abord un coup d'œil à la structure de données définie dans le code source de Redis. Il existe 5 types ici pour économiser de l'espace.
1. len : Pour obtenir la longueur de char[], vous devez parcourir le tableau. La complexité temporelle de len(char[]) est O(n) ; tapez en langage C, seuls char[]. Et char[] doivent d'abord allouer une longueur d'espace, char[] a une longueur pré-alloué et doit être développé une fois les données augmentées
4. buf[] : tableau de caractères en langage C, utilisez '
Dans Redis, tout le stockage est stocké sous la forme de paires clé-valeur KV. K est un type de chaîne, qui est SDS ; V peut être une chaîne, une liste, un hachage, etc. Structures de données prises en charge), V n'est pas directement défini sur un type spécifique, mais est encapsulé avec une couche de redisObject ; la structure de données réellement stockée est spécifiquement pointée par le pointeur ptr ;
Et, afin de mieux économiser de l'espace, redis stocke également les pointeurs ptr de différentes manières, d'une part, lorsqu'un entier de type Long est enregistré, le pointeur dans RedisObject est directement affecté aux données entières, donc aucun pointeur supplémentaire n'est nécessaire. . Il pointe à nouveau vers un entier, économisant ainsi l'espace occupé par les pointeurs. D'autre part, lorsque les données de chaîne sont enregistrées et que la chaîne est inférieure ou égale à 44 octets, les métadonnées, les pointeurs et les SDS dans RedisObject constituent une zone de mémoire continue, évitant ainsi la fragmentation de la mémoire. Cette méthode de mise en page est également appelée méthode de codage embstr. Bien sûr, lorsque la chaîne dépasse 44 octets, la quantité de données SDS commence à augmenter et Redis ne présente plus SDS et RedisObject ensemble, mais alloue un espace indépendant à SDS et utilise un pointeur pour pointer vers la structure SDS. Cette méthode de mise en page est appelée mode d'encodage brut. Comme le montre l'image
raw Si la longueur des caractères SDS natifs est réduite à moins de 44, sera-t-elle inversée en codage embstr ?
Non ; l'encodage sous-jacent de Redis est irréversible après la conversion (pas de restauration).
redis est un middleware de mise en cache couramment utilisé. Nous devons comprendre clairement sa structure de données et son stockage afin de pouvoir choisir une structure de données et une estimation de la mémoire plus appropriées lors de son utilisation.
Adresse de calcul de la mémoire redis http://www.redis.cn/redis_memory/
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!