299 votes

Quelles sont les structures de données sous-jacentes utilisées pour Redis ?

J'essaie de répondre à deux questions en une liste définitive:

  1. Quelles sont les structures de données utilisées pour le Redis?
  2. Et quels sont les principaux avantages/inconvénients/cas d'utilisation pour chaque type?

Donc, j'ai lu le Redis listes sont effectivement mis en œuvre avec les listes chaînées. Mais pour les autres types, je ne suis pas en mesure de creuser toutes les informations. Aussi, si quelqu'un venait à trébucher sur cette question et ne pas avoir un résumé de haut niveau les avantages et les inconvénients de la modification ou de l'accès aux différentes structures de données, ils auraient une liste complète de quand à la meilleure utilisation des types spécifiques de référence.

Plus précisément, je suis à la recherche d'un aperçu de tous types: string, list, set, zset et de hachage.

Oh, j'ai regardé cet article, parmi d'autres, jusqu'à présent:

599voto

antirez Points 9894

Je vais essayer de répondre à votre question, mais je vais commencer avec quelque chose qui peut sembler étrange au premier abord: si vous n'êtes pas intéressé dans le Redis internes, vous ne devez pas soin au sujet de la façon dont les types de données sont mis en œuvre en interne. C'est pour une raison simple: pour chaque Redis opération, vous trouverez la complexité du temps dans la documentation et, si vous avez l'ensemble des opérations et de la complexité du temps, la seule autre chose que vous avez besoin est un peu d'indice sur l'utilisation de la mémoire (et parce que nous faisons de nombreuses optimisations qui peuvent varier en fonction des données, la meilleure façon d'obtenir ces derniers chiffres sont en train de faire un peu trivial monde réel, tests).

Mais puisque vous l'avez demandé, voici l'implémentation sous-jacente de chaque Redis type de données.

  • Les cordes sont mises en œuvre à l'aide d'un C dynamique de la bibliothèque string afin de ne pas payer (asymptotiquement parler) pour les allocations en ajouter opérations. De cette façon, nous avons O(N) ajoute, par exemple, au lieu d'avoir quadratique comportement.
  • Les listes sont mises en œuvre avec les listes chaînées.
  • Les ensembles et les Hachages sont mis en œuvre avec les tables de hachage.
  • Ensembles classés sont mis en œuvre avec skip lists (un type particulier de l'équilibre des arbres).

Mais quand les listes, les ensembles et ensembles classés sont en petit nombre d'éléments et la taille de la plus grande des valeurs, une autre, beaucoup plus compact de codage est utilisé. Ce codage est différente pour les différents types, mais a la particularité que c'est une petite goutte de données qui, souvent, les forces de l'O(N) le scan pour chaque opération. Depuis que nous utilisons ce format uniquement pour les petits objets, ce n'est pas un problème; la numérisation d'un petit O(N) blob cache inconscient donc, pratiquement parlant, il est très rapide, et, quand il y a trop d'éléments de l'encodage est automatiquement commuté à l'encodage natif (liste liée, de hachage, et ainsi de suite).

Mais votre question n'était pas vraiment juste sur internals, votre point est Que le type à utiliser pour accomplir quoi?.

Les chaînes

C'est le type de base de tous les types. C'est l'un des quatre types, mais est également le type de base des types complexes, parce que la Liste est une liste de chaînes, un Set est un ensemble de chaînes de caractères, et ainsi de suite.

Un Redis chaîne est une bonne idée dans les scénarios où vous souhaitez stocker une page HTML, mais également lorsque vous voulez éviter de conversion de votre déjà des données codées. Ainsi, par exemple, si vous avez JSON ou MessagePack vous pouvez stocker des objets comme des chaînes de caractères. Dans le Redis 2.6 vous pouvez même manipuler ce genre d'objet côté serveur à l'aide de scripts Lua.

Un autre élément intéressant de l'utilisation de chaînes est bitmaps, et, en général, l'accès aléatoire tableaux d'octets, depuis le Redis exportations de commandes à accès aléatoire des plages d'octets, ou même de simples bits. Par exemple de voir ce bon blog post: Facile temps réel, statistiques à l'aide de Redis.

Listes

Les listes sont bons quand vous êtes susceptible de ne toucher que les extrêmes de la liste: près de la queue, ou près de la tête. Les listes ne sont pas très bonnes pour paginer des choses, parce que l'accès aléatoire est lent, O(N). Donc bon utilise des listes de plaine files d'attente et les meules, ou la transformation des éléments dans une boucle à l'aide de RPOPLPUSH avec la même source et de destination pour "faire tourner" un anneau d'éléments.

Les listes sont également bien quand on a envie de créer un plafonné collection de N objets, là où d'habitude nous avons accès en haut ou en bas des articles, ou lorsque N est petit.

Jeux

Les ensembles sont un non-ordonnée de collecte de données, de sorte qu'ils sont bon à chaque fois que vous avez une collection d'éléments et il est très important de vérifier l'existence ou de la taille de la collection de façon très rapide. Une autre chose cool à propos de jeux est la prise en charge de tricher ou faire éclater les éléments aléatoires (SRANDMEMBER et SPOP commandes).

Les ensembles sont également bonnes pour représenter des relations, par exemple, "Que font les amis de l'utilisateur X?" et ainsi de suite. Mais d'autres bonnes structures de données pour ce genre de choses sont des ensembles classés comme nous allons le voir.

Jeux de soutenir des opérations complexes comme les intersections, les syndicats, et ainsi de suite, donc c'est une bonne structure de données pour l'utilisation de Redis dans un "calcul" de façon, lorsque vous avez des données et que vous voulez effectuer des transformations sur les données pour obtenir une partie de la sortie.

Les petits jeux sont codés dans une manière très efficace.

Hachages

Les hachages sont la parfaite structure de données pour représenter des objets, composé de champs et de valeurs. Les champs de hachages peuvent également être automatiquement incrémenté à l'aide de HINCRBY. Lorsque vous avez des objets tels que les utilisateurs, les messages blog, ou un autre type d' élément, les hachages sont probablement la voie à suivre si vous ne voulez pas utiliser votre propre codage comme JSON ou similaire.

Cependant, gardez à l'esprit que les petits hachages sont codées de façon très efficace par le Redis, et vous pouvez demander Redis à atomiquement GET, SET ou pour augmenter le champs de l'individu dans un très rapide de la mode.

Hachages peut également être utilisé pour représenter des données liées structures, à l'aide de références. Par exemple vérifier l'lamernews.com la mise en œuvre de commentaires.

Ensembles Classés

Ensembles classés sont les seuls autres structures de données, en plus de listes, de maintenir ordonnée d'éléments. Vous pouvez faire un certain nombre de trucs cool avec les ensembles classés. Par exemple, vous pouvez avoir toutes sortes de Haut de quelque Chose de listes dans votre application web. Top utilisateurs par score, postes de haut niveau par le nombre de pages vues, top que ce soit, mais un seul Redis instance de soutien des tonnes d'insertion et de haut-éléments d'opérations par seconde.

Ensembles classés, à l'instar des jeux, peut être utilisé pour décrire les relations, mais ils vous permettent également de faire de la pagination de la liste des articles et à vous souvenir de l'ordre. Par exemple, si je me souviens des amis de l'utilisateur X avec un ensemble trié je peux facilement me souviens d'eux, dans le but de accepté de l'amitié.

Ensembles classés sont bons pour les files d'attente de priorité.

Ensembles classés sont comme le plus puissant des listes où l'insertion, la suppression ou de l'obtention de gammes à partir du milieu de la liste est toujours rapide. Mais ils utilisent le plus de mémoire, et sont en O(log(N)) structures de données.

Conclusion

J'espère que j'ai donné une info dans ce post, mais il est de loin préférable de télécharger le code source de lamernews de http://github.com/antirez/lamernews et de comprendre comment cela fonctionne. De nombreuses structures de données à partir de Redis sont utilisés à l'intérieur de Lamer Nouvelles, et il y a beaucoup d'indices sur ce qu'il faut utiliser pour résoudre une tâche donnée.

Désolé pour la grammaire des fautes de frappe, il est minuit ici, et trop fatigué pour examiner le post ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X