Indexation avec Redis |  Redis

Indexation avec Redis | Redis

Cet article a été initialement publié sur nosqlgeek.org

Si vous suivez mon actualité sur Twitter, vous vous êtes peut-être rendu compte que je viens de commencer à travailler davantage avec Redis. Redis (=Remote Dictionary Server) est connu sous le nom de Data Structure Store. Cela signifie que nous ne pouvons pas seulement traiter des paires clé-valeur (appelées chaînes dans Redis), mais également des structures de données telles que des hachages (Hash-Maps), des listes, des ensembles ou des ensembles triés. Plus de détails sur les structures de données peuvent être trouvés ici :

Indexation dans les magasins de valeurs-clés

Avec un magasin clé-valeur pur, vous gérez généralement vos structures d’index manuellement en appliquant certains modèles KV-Store. Ici quelques exemples

  • Accès direct via la clé primaire : La clé elle-même est sémantiquement significative et vous pouvez donc accéder directement à une valeur en sachant comment la clé est structurée (en utilisant des modèles de clé). Un exemple serait d’accéder à un profil d’utilisateur en connaissant l’identifiant de l’utilisateur. La clé ressemble à ‘user::‘.
  • Correspondance exacte par une clé secondaire : Le KV-Store lui-même peut être considéré comme un énorme Hash-Map, ce qui signifie que vous pouvez utiliser des éléments de recherche afin d’en référencer d’autres. Cela vous donne une sorte d’index de hachage. Un exemple serait de trouver un utilisateur par son adresse e-mail. L’élément de recherche a la clé ’email::‘, où la valeur est la clé de l’utilisateur. Pour récupérer l’utilisateur avec une adresse e-mail spécifique, il vous suffit de faire une opération Get sur la clé avec le préfixe e-mail, puis une autre sur la clé avec le préfixe utilisateur.
  • Portée par une clé secondaire : C’est là que ça se complique un peu avec les purs KV-Stores. La plupart d’entre eux vous permettent de récupérer une liste de toutes les clés, mais faire un “balayage complet de l’espace des clés” n’est pas efficace (complexité de O(n), n=nombre de clés). Vous pouvez en effet construire votre propre arborescence en stockant des listes sous forme de valeurs et en les référençant entre elles, mais maintenir ces arborescences de recherche côté application n’est vraiment pas ce que vous avez l’habitude de faire.

La méthode Redis

Alors, comment Redis traite-t-il ces exemples ? Nous tirons parti de la puissance des structures de données telles que les hachages et les ensembles triés.

Accès direct via la clé primaire

Une opération Get a déjà une complexité de O(1). C’est la même chose pour Redis.

Correspondance exacte par une clé secondaire

Les hachages (comme leur nom l’indique déjà) peuvent être directement utilisés pour construire un index de hachage afin de prendre en charge les “requêtes” de correspondance exacte. La complexité d’accès à une entrée dans un Redis Hash est en effet O(1). Voici un exemple :

HMSET idx_email david.maier@redis.com user::dmaier
HMSET idx_email max.mustermann@example.com user::mustermann
HGET idx_email david.maier@redis.com
"user::dmaier"

De plus, Redis Hashes prend en charge les opérations en tant que HSCAN. Cela vous fournit une approche basée sur le curseur pour analyser les hachages. De plus amples informations peuvent être trouvées ici:

Voici un exemple :

HSCAN idx_email 0 match d*
1) "0"
2) 1) "david.maier@redis.com"
2) "user::dmaier"

Portée par une clé secondaire

Les ensembles triés peuvent être utilisés pour prendre en charge les “requêtes” de plage. La façon dont cela fonctionne est que nous utilisons la valeur que nous recherchons comme score (numéro de commande). Analyser un tel ensemble trié a alors une complexité de O(log(n)+m) où n est le nombre d’éléments dans l’ensemble et m est la taille de l’ensemble de résultats. Voici un exemple :

ZADD idx_age 37 user::david
ZADD idx_age 9 user::philip
ZADD idx_age 36 user::katrin
ZADD idx_age 13 user::robin
ZADD idx_age 0 user::samuel
ZRANGEBYSCORE idx_age 0 10
1) "user::samuel"
2) "user::philip"

Si vous ajoutez 2 éléments avec le même score alors ils sont triés lexicographiquement. Ceci est intéressant pour les valeurs non numériques. La commande ZRANGEBYLEX permet d’effectuer des ‘requêtes’ de plage en tenant compte de l’ordre lexicographique.

Modules

Redis prend désormais en charge les modules (depuis la v4.0). Les modules vous permettent d’étendre les fonctionnalités de Redis. Un module qui correspond parfaitement au sujet de cet article de blog est RediSearch. RediSearch fournit essentiellement des fonctionnalités d’indexation et de recherche de texte intégral à Redis. Il utilise un index inversé dans les coulisses. Vous trouverez plus de détails sur RediSearch ici :

Voici un exemple très basique de la documentation RediSearch :

FT.CREATE myIdx SCHEMA title TEXT WEIGHT 5.0 body TEXT url TEXT
FT.ADD myIdx doc1 1.0 FIELDS title "hello world" body "lorem ipsum" url "http://redis.io"
FT.SEARCH myIdx "hello world" LIMIT 0 10
1) (integer) 1
2) "doc1"
3) 1) "title"
2) "hello world"
3) "body"
4) "lorem ipsum"
5) "url"
6) "http://redis.io"

Comme d’habitude, j’espère que vous avez trouvé cet article utile et informatif. Les commentaires sont les bienvenus !

Development Source

Related Posts

RLEC 4.2.1 apporte des contrôles granulaires à la haute disponibilité et aux performances

RLEC 4.2.1 apporte des contrôles granulaires à la haute disponibilité et aux performances

Comment HolidayMe utilise Redis Enterprise comme base de données principale

Comment HolidayMe utilise Redis Enterprise comme base de données principale

Annonce de RedisGears 1.0 : un moteur sans serveur pour Redis

Annonce de RedisGears 1.0 : un moteur sans serveur pour Redis

Clés Redis dans la RAM |  Redis

Clés Redis dans la RAM | Redis

No Comment

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *