Guide d'administration Redis : cache, sessions, pub/sub et haute disponibilité.
Concepts Clés
flowchart LR
subgraph "Cas d'Usage Redis"
A[Cache Applicatif] --> R[(Redis)]
B[Sessions Utilisateurs] --> R
C[Pub/Sub Messages] --> R
D[Rate Limiting] --> R
E[Queues/Jobs] --> R
F[Leaderboards] --> R
end
Caractéristique
Valeur
Type
Key-Value Store
Stockage
In-Memory (RAM)
Persistance
RDB (snapshots) / AOF (journal)
Latence
< 1ms
Protocole
RESP (Redis Serialization Protocol)
Installation
# Depuis les repos EPELsudodnfinstall-yepel-release
sudodnfinstall-yredis
# Ou depuis le repo officiel Redissudodnfinstall-yhttps://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudodnfmoduleenableredis:remi-7.2
sudodnfinstall-yredis
# Démarrer et activersudosystemctlenable--nowredis
# Lancement simpledockerrun-d\--nameredis\-p6379:6379\redis:7-alpine
# Avec persistance et mot de passedockerrun-d\--nameredis\-p6379:6379\-vredis_data:/data\redis:7-alpine\redis-server--requirepass"your_password"--appendonlyyes
# Connexiondockerexec-itredisredis-cli-ayour_password
Vérification
# Test de connexionredis-cliping
# Réponse attendue : PONG# Informations serveurredis-cliINFOserver
# /etc/redis/redis.conf# === Réseau ===bind 127.0.0.1 -::1# Localhost uniquement (sécurité)# bind 0.0.0.0 # Toutes les interfaces (avec mot de passe!)port 6379protected-mode yes# === Sécurité ===requirepass your_strong_password_here# Renommer les commandes dangereusesrename-command FLUSHALL ""rename-command FLUSHDB ""rename-command CONFIG ""rename-command DEBUG ""# === Mémoire ===maxmemory 2gbmaxmemory-policy allkeys-lru # Politique d'éviction# === Persistance RDB (Snapshots) ===save 900 1 # Snapshot si 1 clé modifiée en 900ssave 300 10 # Snapshot si 10 clés modifiées en 300ssave 60 10000 # Snapshot si 10000 clés modifiées en 60sdbfilename dump.rdbdir /var/lib/redis# === Persistance AOF (Append Only File) ===appendonly yesappendfilename "appendonly.aof"appendfsync everysec # Bon compromis performance/durabilité# appendfsync always # Plus sûr mais plus lent# appendfsync no # Plus rapide mais risque de perte# === Logs ===loglevel noticelogfile /var/log/redis/redis-server.log# === Performance ===tcp-keepalive 300timeout 0databases 16
Politiques d'Éviction (maxmemory-policy)
Politique
Description
Cas d'usage
noeviction
Erreur si mémoire pleine
Données critiques
allkeys-lru
LRU sur toutes les clés
Cache général
volatile-lru
LRU sur clés avec TTL
Cache avec expiration
allkeys-lfu
LFU sur toutes les clés
Cache fréquentiel
volatile-ttl
Expire les clés TTL les plus proches
Sessions
allkeys-random
Éviction aléatoire
Test
Commandes Essentielles
Strings
# SET / GETSETuser:1:name"John Doe"GETuser:1:name
# Avec expiration (TTL)SETsession:abc123"user_data"EX3600# Expire dans 1 heureSETEXsession:abc1233600"user_data"# Équivalent# Incrémenter/DécrémenterSETcounter0INCRcounter# 1INCRBYcounter10# 11DECRcounter# 10# Vérifier l'existenceEXISTSuser:1:name# 1 (existe) ou 0# SupprimerDELuser:1:name
# TTL restantTTLsession:abc123# Secondes restantes, -1 si pas de TTL, -2 si n'existe pas
Hashes
# Stocker un objetHSETuser:1name"John"email"john@example.com"age30# Récupérer un champHGETuser:1name
# Récupérer toutHGETALLuser:1
# Incrémenter un champHINCRBYuser:1age1# Vérifier l'existence d'un champHEXISTSuser:1email
Lists
# Ajouter des élémentsLPUSHqueue:jobs"job1"# Début de listeRPUSHqueue:jobs"job2"# Fin de liste# Récupérer et supprimer (queue)LPOPqueue:jobs# Premier élémentRPOPqueue:jobs# Dernier élémentBLPOPqueue:jobs30# Blocking pop (attendre 30s)# Voir les élémentsLRANGEqueue:jobs0-1# TousLLENqueue:jobs# Longueur
Sets
# Ajouter des membresSADDtags:post:1"redis""database""cache"# Membres du setSMEMBERStags:post:1
# Vérifier l'appartenanceSISMEMBERtags:post:1"redis"# 1 ou 0# Opérations ensemblistesSINTERtags:post:1tags:post:2# IntersectionSUNIONtags:post:1tags:post:2# UnionSDIFFtags:post:1tags:post:2# Différence
Sorted Sets
# LeaderboardZADDleaderboard100"player1"250"player2"180"player3"# Top 3ZREVRANGEleaderboard02WITHSCORES
# Rang d'un joueurZREVRANKleaderboard"player2"# 0 = premier# Incrémenter le scoreZINCRBYleaderboard50"player1"
# Python avec redis-pyimportredisimportjsonr=redis.Redis(host='localhost',port=6379,password='your_password',decode_responses=True)defget_user(user_id):# 1. Chercher dans le cachecache_key=f"user:{user_id}"cached=r.get(cache_key)ifcached:returnjson.loads(cached)# 2. Cache miss : chercher en baseuser=db.query(f"SELECT * FROM users WHERE id = {user_id}")# 3. Stocker dans le cache (TTL 1 heure)r.setex(cache_key,3600,json.dumps(user))returnuserdefinvalidate_user_cache(user_id):r.delete(f"user:{user_id}")
# Informations complètesredis-cliINFO
# Sections spécifiquesredis-cliINFOmemory
redis-cliINFOstats
redis-cliINFOreplication
redis-cliINFOclients
# Métriques clésredis-cliINFOmemory|grepused_memory_human
redis-cliINFOstats|grepinstantaneous_ops_per_sec
redis-cliINFOclients|grepconnected_clients
# Monitor en temps réel (ATTENTION: impact perf)redis-cliMONITOR
# Statistiques des commandesredis-cliINFOcommandstats
Métriques Importantes
# Script de monitoringcat<< 'EOF' > /opt/scripts/redis_check.sh#!/bin/bashecho "=== Redis Health Check ==="redis-cli -a $REDIS_PASSWORD INFO | grep -E "^(used_memory_human|connected_clients|instantaneous_ops_per_sec|keyspace_hits|keyspace_misses|expired_keys|evicted_keys)"echo -e "\n=== Hit Ratio ==="HITS=$(redis-cli -a $REDIS_PASSWORD INFO stats | grep keyspace_hits | cut -d: -f2 | tr -d '\r')MISSES=$(redis-cli -a $REDIS_PASSWORD INFO stats | grep keyspace_misses | cut -d: -f2 | tr -d '\r')if [ $((HITS + MISSES)) -gt 0 ]; then RATIO=$(echo "scale=2; $HITS * 100 / ($HITS + $MISSES)" | bc) echo "Cache Hit Ratio: ${RATIO}%"fiEOFchmod+x/opt/scripts/redis_check.sh
Slow Log
# Configurer le slow logredis-cliCONFIGSETslowlog-log-slower-than10000# 10msredis-cliCONFIGSETslowlog-max-len128# Voir les requêtes lentesredis-cliSLOWLOGGET10# Nombre d'entréesredis-cliSLOWLOGLEN
# Resetredis-cliSLOWLOGRESET
# Créer un cluster (6 nœuds minimum : 3 masters + 3 replicas)redis-cli--clustercreate\10.0.0.1:637910.0.0.2:637910.0.0.3:6379\10.0.0.4:637910.0.0.5:637910.0.0.6:6379\--cluster-replicas1\-ayour_password
# Vérifier le clusterredis-cli-c-ayour_passwordCLUSTERINFO
redis-cli-c-ayour_passwordCLUSTERNODES
Sauvegarde et Restauration
Sauvegarde RDB
# Déclencher un snapshotredis-cliBGSAVE
# Vérifier le statutredis-cliLASTSAVE
# Copier le fichier dump.rdbcp/var/lib/redis/dump.rdb/backup/redis_$(date+%Y%m%d).rdb
Sauvegarde AOF
# Réécrire l'AOF (compacter)redis-cliBGREWRITEAOF
# Copier les fichiers AOFcp/var/lib/redis/appendonly.aof*/backup/
Restauration
# 1. Arrêter Redissudosystemctlstopredis
# 2. Copier le fichier de backupcp/backup/redis_20241130.rdb/var/lib/redis/dump.rdb
chownredis:redis/var/lib/redis/dump.rdb
# 3. Redémarrer Redissudosystemctlstartredis
# 4. Vérifierredis-cliDBSIZE
Sécurité
Checklist de Sécurité
[ ] requirepass configuré avec un mot de passe fort
[ ] bind restreint (pas 0.0.0.0 sans mot de passe)
[ ] protected-mode yes
[ ] Commandes dangereuses renommées ou désactivées
[ ] TLS activé si accès distant
[ ] Firewall configuré (port 6379)
[ ] Utilisateur dédié (non-root)
Configuration TLS
# redis.conftls-port 6380port 0 # Désactiver le port non-TLStls-cert-file /etc/redis/redis.crttls-key-file /etc/redis/redis.keytls-ca-cert-file /etc/redis/ca.crttls-auth-clients yes