Lorsque l'on parle de base de données, on pense souvent aux bases relationnelles comme MySQL, MariaDB ou encore PostgreSQL, mais tous les systèmes de gestions de bases de données (SGBD) ne sont pas relationnels, et tous n'utilisent pas le langage SQL.

On regroupe tous ces systèmes sous un nom : le NoSQL (littéralement pas de SQL).

Mais sous cette bannière très (trop) large, on y retrouve des systèmes très différents, comme des bases de données de documents, de graphes ou encore des dictionnaires (clés-valeurs).

Aujourd'hui nous allons parler de Redis, l'une des bases NoSQL les plus populaires et les plus rapides du marché.

Les particularités de Redis

Redis est avant tout un système de base de données, son rôle est donc de recevoir des données, de les stocker et de les redistribuer à la demande, mais son fonctionnement diffère assez largement des systèmes les plus classiques, notamment au travers de ces trois particularités :

Les données "In-memory"

La majorité des SGBD stockent les données collectées sur un disque dur physique, mais pour améliorer la rapidité de son système, Salvatore Sanfilippo le créateur de Redis, décide que les données injectées dans ce dernier seront directement stockées dans la mémoire vive (RAM) de la machine.

Néanmoins, des copies des données sont faites très régulièrement et stockées sous forme de fichiers binaires, afin que les données puissent être rechargées et remontées en RAM lors d'une défaillance de la machine.

Ce stockage en mémoire vive en fait une des bases de données les plus rapide pour l'accès aux données, que ce soit en lecture ou en écriture.

Pour référence, la documentation officielle de Redis stipule que ce dernier est capable de "scanner une base de 1 million de clés en 40 millisecondes en tournant sur un ordinateur portable d'entrée de gamme".

Le stockage clé-valeur

Ici pas de table, pas de documents, mais pour chaque entrée dans la base : une valeur, associée à une clé unique.

On parle plus souvent de dictionnaire, et c'est d'ailleurs de là que vient le nom de Redis qui signifie "REmote DIctionnaire Server".

Si vous avez l'habitude d'indexer vos données avec des clés primaires (et secondaires), dites-vous que Redis ne contient qu'un seul index, celui des clés présentes dans la base.

Si vous avez l'habitude d'utiliser le localStorage en web, c'est exactement la même chose, c'est un stockage clé-valeur, un dictionnaire.

Ici pas d'auto-incrémentation, c'est vous qui décidez du nom de chaque clé pour chaque valeur que vous allez stocker.

Pour qu'elles soient uniques, les clés sont souvent composées de plusieurs "namespace", le plus souvent séparés par deux points, ce qui nous donne par exemple : "user:nicolas@brondin.com" ou encore "analytic:signup:2020:02:17".

Les types de données

Derrière chaque clé dans la base se trouve une valeur, mais cette valeur peut prendre différents types, allant de la simple chaine de caractères jusqu'à des types complexes et très pratiques dont voici une liste non-exhaustive :

  • Chaine de caractères (String)
  • Listes de valeurs (List)
  • Ensemble non-ordonné (Set)
  • Ensemble ordonné (Sorted set)
  • Dictionnaire (Hash)

Si vous n'êtes pas familier avec ce genre de structures de données :

  • Un ensemble (Set) est une liste dont les valeurs ne doivent pas se répéter
  • Un dictionnaire (Hash), permet de stocker des objets sous la forme clés-valeurs, comme en JSON

Quelques fonctionnalités

Redis offre de nombreuses fonctionnalités pour retrouver une clé (ou un ensemble de clés) très rapidement, pour ensuite pouvoir récupérer la valeur, la modifier ou la supprimer.

Comme avec un vrai dictionnaire, on ne recherche pas une définition précise pour trouver un mot, ce serait trop long.

On cherche d'abord un mot, trié dans un ordre logique, pour voir sa définition.

Ici, c'est la même chose, nous avons un ensemble de commandes pour parcourir ce dictionnaire et le modifier, pour le reste, c'est à vous de faire attention à la manière dont vous allez penser et créer vos clés !

Création d'une clé

Avec Redis on ne demande pas à créer de nouvelles clés, on rentre une valeur associée à une clé, si cette dernière existe déjà, elle est modifié, sinon elle est créée.

Par exemple, pour sauvegarder une nouvelle valeur de type String, on pourra simplement faire :

  • SET key "value"
  • ou bien MSET key "value" [key "value" ...]

La commande MSET permet de créer plusieurs couples clés-valeurs (String) dans la même opération. À noter qu'il existe des commandes différentes pour les autres types de données.

Lien vers la documentation officielle de SET et MSET

Opérations multiples

Tout comme MSET vu précédemment, il est possible d'effectuer des commandes sur plusieurs clés en même temps, créant alors des opérations atomiques (qui ne peuvent pas être séparées en plusieurs sous-opérations), par exemple :

  • MGET key [key ...] pour récupérer les valeurs de plusieurs clés
  • DEL key [key ...] pour supprimer plusieurs clés
Lien vers la documentation officielle de MGET et DEL

Recherche de clé par pattern

Il est possible de rechercher une liste de clés suivant le même format, en utilisant une syntaxe proche des expressions régulières.

Prenons par exemple une base contenant les clés :

  • "user:nicolas@gmail.com"
  • "user:john@live.fr"
  • "sandrine@gmail.com"

Pour récupérer les clés des utilisateurs inscrits avec une adresse gmail, il suffira de faire :

  • KEYS user:*@gmail.com
Lien vers la documentation officielle de la commande KEYS

Transactions

Redis permet d'effectuer des opérations atomiques de différentes natures au sein d'une transaction.

La notion de transaction est indispensable en base de données car elle permet de s'assurer que toutes les opérations se sont déroulées avec succès avant de sauvegarder les modifications dans la base.

Cela permet de s'assurer de l'intégrité des données, et avec Redis il est possible de le faire en combinant les commandes EXEC et MULTI comme ceci :

MULTI
SET hello "world"
GET hello
EXEC

Ici on ne récupèrera le contenu de la clé hello que si elle a bien été créé auparavant, ce cas d'usage est évidemment uniquement à titre d'exemple.

Lien vers la documentation officielle de MULTI et EXEC

Et bien d'autres

Le but ici n'est pas de faire une liste exhaustive de toutes les fonctionnalités, mais de vous montrer que la première prise en main de Redis est accessible à la majorité des développeurs (et développeuses) sans trop d'obstacles.

Pour aller plus loin, il est aussi possible de gérer des flux, des données géo-spatiales, de gérer des envois de messages en temps-réel...

Les cas d'usage

Parmi les entreprises qui utilisent Redis, on peut notamment citer Twitter, GitHub, Snapchat et StackOverflow qui ne sont qu'une fraction des utilisateurs, mais qui montre la solidité de cette technologie.

Mais au final, à quoi peut servir Redis ? Peut-on s'en servir comme une base de données classique ?

La réponse est oui, mais ce n'est pas le meilleur usage que vous puissiez en faire.

Si vous avez un schéma de données contenant beaucoup de relations les unes avec les autres, alors il est plus judicieux d'utiliser un système de base de donnée relationnelle en base principale.

Mais l'intérêt de Redis est de tourner en parallèle de votre SGBD classique pour gérer des données spécifiques, soient parce qu'elles sont très nombreuses, soit parce que ces données nécessite une vitesse de lecture ou d'écriture très élevée.

Voici donc quelques exemples d'utilisation d'une base Redis :

  • Mise en cache de pages HTML
  • Mise en cache de requêtes SQL
  • Stockage de sessions utilisateurs
  • Gestion des notifications d'un réseau social
  • Analyses en temps réelles et statistiques
  • ...

Maintenant c'est à vous de trouver quel usage vous allez pouvoir faire de cette base de données dans l'architecture de votre projet !

J'espère que cet article vous aura été utile, et à bientôt sur le blog !

À propos de l'auteur

Hello, je suis Nicolas Brondin-Bernard, ingénieur web indépendant depuis 2015 passionné par le partage d'expériences et de connaissances.

Aujourd'hui je suis aussi coach pour développeurs web juniors, tu peux me contacter sur nicolas@brondin.com, sur mon site ou devenir membre de ma newsletter pour ne jamais louper le meilleur article de la semaine et être tenu au courant de mes projets !


Photo par Guillaume Jaillet sur Unsplash