Maîtriser Redis de zéro : types de données, commandes essentielles, expiration, persistance, cas d'usage réels (cache, sessions, files d'attente) et intégration Node.js.
Redis n'est pas un simple magasin clé → chaîne. Il supporte plusieurs structures de données natives, chacune avec ses propres commandes et cas d'usage. Choisir le bon type, c'est la moitié du travail.
Le type le plus simple. Une clé pointe vers une valeur : texte, nombre, JSON sérialisé, binaire. Limite : 512 Mo par valeur.
SET user:42:name "Alice"
GET user:42:name
# "Alice"
# Incrémenter un compteur atomiquement
SET page:views 0
INCR page:views
# (integer) 1
INCRBY page:views 10
# (integer) 11
DECR page:views
# (integer) 10
# Stocker du JSON
SET session:abc123 '{"userId":42,"role":"admin"}'
GET session:abc123INCR / DECR sont atomiques — pas de race condition même avec des milliers de clients simultanés.
Liste ordonnée d'éléments, accessible depuis les deux extrémités. Implémentée comme une linked list : insertion en tête/queue en O(1), accès par index en O(n).
# Ajouter à gauche (head)
LPUSH notifications:user:42 "Nouveau commentaire"
LPUSH notifications:user:42 "Nouveau follower"
# Lire les N premiers éléments
LRANGE notifications:user:42 0 9
# 1) "Nouveau follower"
# 2) "Nouveau commentaire"
# Taille de la liste
LLEN notifications:user:42
# (integer) 2
# Retirer et retourner le dernier élément (pour les files d'attente)
RPOP notifications:user:42
# "Nouveau commentaire"Cas d'usage typiques : files d'attente de tâches, timelines, logs récents.
Collection de paires champ → valeur sous une clé. L'équivalent d'un objet ou d'une ligne de base de données.
# Stocker un utilisateur
HSET user:42 name "Alice" email "alice@example.com" role "admin"
# Lire un champ
HGET user:42 name
# "Alice"
# Lire tous les champs
HGETALL user:42
# 1) "name"
# 2) "Alice"
# 3) "email"
# 4) "alice@example.com"
# 5) "role"
# 6) "admin"
# Incrémenter un champ numérique
HINCRBY user:42 login_count 1
# Vérifier si un champ existe
HEXISTS user:42 email
# (integer) 1Avantage vs JSON sérialisé : vous pouvez lire ou modifier un seul champ sans désérialiser tout l'objet.
Collection non ordonnée de membres uniques. Pas de doublons, pas d'ordre garanti. Opérations ensemblistes (union, intersection, différence) natives.
# Ajouter des membres
SADD article:1:tags "redis" "database" "performance"
SADD article:2:tags "redis" "nodejs" "cache"
# Vérifier l'appartenance
SISMEMBER article:1:tags "redis"
# (integer) 1
# Lister tous les membres
SMEMBERS article:1:tags
# 1) "redis"
# 2) "database"
# 3) "performance"
# Intersection — tags communs entre deux articles
SINTER article:1:tags article:2:tags
# 1) "redis"
# Union
SUNION article:1:tags article:2:tagsCas d'usage typiques : tags, liste d'IDs uniques (utilisateurs en ligne), "qui a vu cet article".
Comme un Set, mais chaque membre a un score numérique. Les membres sont ordonnés par score, du plus petit au plus grand. Accès par rang ou par plage de scores en O(log n).
# Ajouter avec score
ZADD leaderboard 1500 "alice"
ZADD leaderboard 2300 "bob"
ZADD leaderboard 1800 "charlie"
# Top 3 (ordre décroissant)
ZREVRANGE leaderboard 0 2 WITHSCORES
# 1) "bob"
# 2) "2300"
# 3) "charlie"
# 4) "1800"
# 5) "alice"
# 6) "1500"
# Rang d'un joueur (0-based, ordre croissant)
ZRANK leaderboard "alice"
# (integer) 0
# Score d'un joueur
ZSCORE leaderboard "bob"
# "2300"Cas d'usage typiques : classements, rate limiting par fenêtre glissante, tâches planifiées (score = timestamp d'exécution).
| Besoin | Type |
|---|---|
| Valeur simple, compteur, JSON | String |
| File d'attente, timeline | List |
| Objet avec plusieurs champs | Hash |
| Collection unique, tags | Set |
| Classement, tri par score | Sorted Set |
Les types sont en place. Le chapitre suivant couvre les commandes transversales (TTL, scan, type) et les patterns de nommage des clés.