Pourquoi Python avec Redis : guide pratique ?
Au quotidien, les développeurs ont besoin de stocker des données temporairement en mémoire vive pour une accès rapide et une meilleure performance. C'est là que Redis entre en jeu. C'est un système en mémoire clé-valeur qui offre une grande vitesse d'accès et est idéal pour le traitement à haute vitesse, l'analyse de big data et la mise en cache.
Un cas d'utilisation concret serait de mettre en place un système de mise en cache pour une application web. En utilisant Redis, on peut stocker les résultats des requêtes fréquentes en mémoire vive, ce qui accélère la réponse du serveur et réduit le temps de traitement.
Prerequis
- Connaissance avancée de Python
- Familiarité avec les structures de données clés-valeur
- Installation de Redis (version 4.0 ou plus tard)
- Installation de pip (Python package installer)
Concepts fondamentaux
Connexion à Redis
Pour se connecter à un serveur Redis, on utilise la bibliothèque redis-py. Voici comment est structure une connexion.
import redis
## Connexion au serveur Redis local
r = redis.Redis(host='localhost', port=6379, db=0)
Stockage et récupération des données
Redis permet de stocker différents types de données : chaînes (strings), listes, ensembles, hashes et séries temporelles. Voici comment stocker et récupérer une chaîne.
## Stockage d'une chaîne
r.set('nom', 'John Doe')
## Récupération d'une chaîne
nom = r.get('nom')
print(nom.decode()) # Decode le bytes en string
Expiration des clés
Redis permet de définir une durée d'expiration pour chaque clé. Cela est utile pour les données temporaires.
## Stockage avec expiration (5 secondes)
r.setex('nom_temporaire', 5, 'John Doe')
Transactions
Redis supporte les transactions pour assurer l'intégrité des opérations.
pipeline = r.pipeline()
## Ajoute plusieurs commandes au pipeline
pipeline.set('a', 10)
pipeline.set('b', 20)
## Exécute toutes les commandes du pipeline
pipeline.execute()
Mise en pratique : projet fil rouge
Étape 1 : Création de l'environnement
mkdir redis-python-project
cd redis-python-project
pip install redis
Créez un fichier main.py avec le contenu suivant :
import redis
## Connexion au serveur Redis local
r = redis.Redis(host='localhost', port=6379, db=0)
Étape 2 : Stockage et récupération des tâches
Créez un fichier tasks.py avec le contenu suivant :
import redis
from datetime import datetime
## Connexion au serveur Redis local
r = redis.Redis(host='localhost', port=6379, db=0)
def add_task(task):
task_id = str(datetime.now().timestamp())
r.set(task_id, task)
return task_id
def get_tasks():
keys = r.keys('*')
tasks = {key.decode(): r.get(key).decode() for key in keys}
return tasks
Étape 3 : Interface utilisateur (CLI)
Créez un fichier cli.py avec le contenu suivant :
import sys
from tasks import add_task, get_tasks
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: python cli.py [add|get]")
sys.exit(1)
command = sys.argv[1]
if command == "add":
task = ' '.join(sys.argv[2:])
if task:
task_id = add_task(task)
print(f"Task added with ID: {task_id}")
else:
print("Please provide a task description.")
elif command == "get":
tasks = get_tasks()
for task_id, task in tasks.items():
print(f"{task_id}: {task}")
else:
print("Invalid command. Use 'add' to add a task or 'get' to list all tasks.")
Étape 4 : Exécution du projet
python cli.py add "Buy groceries"
python cli.py get
Erreurs frequentes et debugging
Erreur :
RedisError: Connection refused# ❌ Mauvais r = redis.Redis(host='localhost', port=6379, db=0) # ✅ Correct r = redis.Redis(host='127.0.0.1', port=6379, db=0)Erreur :
TypeError: 'NoneType' object is not subscriptable# ❌ Mauvais task_id = r.get('nom') print(task_id['a']) # ✅ Correct task_id = r.get('nom') if task_id: print(task_id.decode()['a'])Erreur :
PipelineError: Transaction discarded# ❌ Mauvais pipeline = r.pipeline() pipeline.set('a', 10) pipeline.set('b', 20) pipeline.execute() # ✅ Correct pipeline = r.pipeline(True) # Activer les transactions pipeline.set('a', 10) pipeline.set('b', 20) try: pipeline.execute() except redis.WatchError: print("Transaction discarded")
Pour aller plus loin
Piste 1 : Utiliser Redis pour le cache d'une API
Utilisez Redis pour mettre en cache les résultats des requêtes à une API externe. Cela réduit le nombre de requêtes HTTP et améliore la performance.
Piste 2 : Implémenter un système de notifications avec Redis Streams
Redis Streams est idéal pour implémenter un système de notifications en temps réel. Créez un script qui envoie des notifications dans une stream et un autre qui les consomme.
Piste 3 : Utiliser Redis pour le comptage d'occurrences
Utilisez Redis pour compter l'occurrence de certains événements. Cela peut être utilisé pour surveiller la popularité des articles, par exemple.
Défi pratique
Implémentez un système de leaderboard en utilisant Redis. Chaque utilisateur a une score et vous devez afficher les 10 meilleurs scores en temps réel.