Redis

RedisNoSQL
Farid LAOUFI - 31/03/2023 à 17:02:230 commentaire

Généralités


Le nom « Redis » a pour signification « REmote DIctionary Service ». Il s’agit d’un produit faisant partie de la grande famille des bases de données NoSQL. Pour rappel, dans une base de données NoSQL, les données sont accessibles via des clés pouvant par exemple être des chaînes de caractères. Dans le cas de Redis, les données sont stockées en mémoire vive, ce qui a un impact immédiat : les performances ! Avec Redis, pas de latence induite par des accès disque. En prime, Redis est open source, gratuit dans des scénarios on premise ou Kubernetes, et proposé en tant que solution SaaS par de nombreux acteurs (Azure, AWS, RedisCloud, …).


Structures de données


Dans une base de données relationnelle (PostgreSQL, SQL Server, …), les données sont stockées dans des tables structurées en colonnes. Dans MongoDB, elles sont représentées en BSON. Amazon DynamoDB utilise des tables contenant des enregistrements qui sont eux-mêmes des collections de clés-valeurs. Tous ces exemples illustrent le fait que, la plupart du temps, les données sont représentées dans un format générique. Rien de tel avec Redis ! Stocker les données en mémoire vive a une conséquence immédiate : elles peuvent être représentées en utilisant des structures de données différentes, disposant chacune d’opérations spécifiques. Certaines de ces structures sont brièvement décrites ci-dessous, des informations plus détaillées sont disponibles à cette adresse : https://redis.io/docs/data-types/.


String

Attention, le nom est trompeur ! Dans Redis, un string est une séquence d’octets, et peut donc stocker du texte, un nombre, etc. Il s’agit du type le plus communément utilisé dans Redis, et il est très utile pour mettre en cache des données. Il propose en plus des opérations pouvant s’avérer être très utiles dans certains cas d’utilisation, en voici deux exemples :

  • Redis peut incrémenter ou décrémenter des valeurs de manière atomique, ce qui en fait une solution très commode pour implémenter des compteurs.
  • Il est possible d’associer à une clé une valeur quelconque seulement si ladite clé n’existe pas. Cela n’a l’air de rien, mais cette fonctionnalité permet d’utiliser Redis comme un système de verrous distribués.


Liste

Ici aussi, le nom peut induire en erreur, il est question de listes simplement chaînées, très efficaces lors de l’accès aux premier et au dernier éléments. Une liste Redis permet aisément d’implémenter une queue ou une pile, modifiable de manière atomique : dans des cas simples, Redis est parfaitement capable de se substituer à des produits tels que RabbitMQ.


Set

Voilà une structure de données dont le nom n’est pas trompeur ! Elle permet de représenter un ensemble non ordonné d’éléments uniques. Utile pour constituer un index. Seule contrainte : les données étant stockées en mémoire vive dans Redis, mieux vaut ne pas créer des sets trop volumineux. Si plusieurs sets sont présents dans Redis, ce dernier permet d’appliquer sur eux les opérations ensemblistes classiques (union et intersection par exemple).


Hash

Un hash Redis associe à des clés uniques des valeurs. En clair, il s’agit d’une table de hachage, mutable, très similaire à un objet JavaScript. Il y a une limitation à prendre en compte : les valeurs associées aux clés doivent impérativement être de type string, donc inutile d’essayer de représenter avec un seul hash un objet tel que celui-ci :


{
    "user": "user123",
    "contact": {
        "phone": "0123456789",
        "mail": "user123@az.com"
    }
}


Dans l'exemple ci-dessus, un string pourra représenter le nom de l'utilisateur, et un hash les informations permettant de le contacter.


Les hashs permettent d’utiliser Redis comme une base NoSQL orientée documents simple. Autre exemple : dans un jeu multijoueur, ils pourraient être utilisés pour représenter l’état d’une partie (les caractéristiques des joueurs, leurs points de vie, …).


Architecture


Threads

Dans une certaine mesure, Redis peut être comparé à Node.js : Redis utilise principalement un thread, et au besoin des threads auxiliaires dans les dernières versions. Redis sera donc plus efficace avec des processeurs rapides, disposant de beaucoup de cache, et d’un nombre limité de cœurs. Sur des serveurs disposant de processeurs dotés de beaucoup de cœurs, il est probablement possible de mettre en place une configuration similaire à celle utilisée classiquement pour Node.js, c’est-à-dire lancer plusieurs instances de Redis en configurant pour chacune d’entre elle une affinité de cœur, mais l’intérêt semble plus que limité, étant donné que Redis stocke ses données en mémoire vive…


Données persistantes

Comme cela a été mentionné plusieurs fois dans cet article, Redis stocke les données en mémoire vive. Ceci étant dit, il est possible de configurer Redis de telle manière à ce que les données soient enregistrées sur un support permanent, ce qui permet de les restaurer en cas de redémarrage. Attention : cela ne signifie pas pour autant que Redis implémente toutes les caractéristiques ACID, des pertes de données restent possibles.


Haute disponibilité

Aucune magie ici, dans un scénario on premise ou Kubernetes de la configuration sera nécessaire. Il est possible de mettre en place de la réplication de manière aisée. Une manière de faire beaucoup plus avancée consiste à utiliser un outil nommé Redis Sentinel, effectuant de la supervision et choisissant automatiquement un serveur Redis maître. La documentation complète est ici : https://redis.io/docs/management/sentinel/.


Cas d’utilisation


Voici une liste non exhaustive de situations dans lesquelles Redis est une solution appropriée.


Cache

Il s’agit clairement du cas d’utilisation le plus courant de Redis. Les données étant en mémoire vive, elles pourront être obtenues avec une latence inférieure à celle de la source originelle, ce qui permettra de soulager les différentes bases de données utilisées par une application. Dans le cas de données coûteuses à calculer, parce qu’elles requièrent beaucoup de CPU ou d’entrées/sorties, le bénéfice sera encore plus évident !


Sessions web

Redis est très populaire pour stocker les données de session web, et ce sur plusieurs plateformes (ASP.NET Core, Node.js, …). En effet, Redis constitue une solution commode et performance pour partager les données de session dans une ferme de serveurs.


Verrous distribués

Si vous disposez d’une application ayant plusieurs instances, cette fonctionnalité peut s’avérer très utile. Une situation relativement courante est qu'au moins deux instances tentent en même temps d’effectuer la même tâche. Pour prévenir ce genre de cas, elles peuvent chacune demander un verrou auprès de Redis, et seule celle l’ayant obtenu effectuera ladite tâche.


Prototypage

Les structures de données proposées par Redis sont généralement plus que suffisantes pour créer rapidement un prototype d’une application, d’autant plus qu’il n’est pas nécessaire de définir un quelconque schéma (pas de table ou autre), ce qui permet de se concentrer sur le code applicatif.


Installation


Serveur

Concernant la partie serveur, le plus commode est d’utiliser Docker :

docker run -d -p 6379:6379 redis

Libre à vous de personnaliser cette commande comme bon vous semble, en donnant par exemple un nom à votre conteneur.


Client

Afin de pouvoir expérimenter les différentes possibilités offertes par Redis, l’outil en ligne de commande redis-cli peut être utilisé. Pour ce, le plus simple est de lancer un terminal en mode interactif sur votre conteneur Redis :

docker container exec -it <nom-de-votre-conteneur> redis-cli

Le plus commode reste néanmoins de disposer de redis-cli directement sur votre poste de travail. Si vous utilisez une distribution Linux (ou WSL), l’outil peut être installé via cette commande (ou une commande similaire pour une distribution différente d’Ubuntu) :

sudo apt install redis-tools

Autre solution, ayant le mérite de fonctionner sous Windows, repompée ici :

npm install -g redis-cli

Oui, quelqu’un a bien réécrit redis-cli en TypeScript…

Quelle que soit la solution mise en œuvre pour installer redis-cli, une bonne documentation pour commencer à l’utiliser est disponible à cette adresse : https://redis.io/docs/data-types/tutorial/.

Commentaires :

Aucun commentaires pour le moment


Laissez un commentaire :

Réalisé par
Expaceo