Introduction à l'extension PHP Redis
L'extension phpredis offre une interface PHP performante pour interagir avec Redis. Elle permet d'exploiter les fonctionnalités avancées de Redis, comme le tri des listes, pour créer des relations métier en mémoire.
Connexion au serveur Redis
<?php
$redisClient = new Redis();
$redisClient->connect('127.0.0.1', 6379, 2.5);
$redisClient->ping(); // Vérification de la connexion
?>
Opérations sur les clés
Suppression de clés
La commande DEL supprime une ou plusieurs clés spécifiées.
<?php
$redisClient->set('utilisateur:nom', 'Pierre');
echo $redisClient->get('utilisateur:nom'); // Affiche: Pierre
$redisClient->del('utilisateur:nom');
var_dump($redisClient->get('utilisateur:nom')); // bool(false)
$donnees = ['cle1' => 'valeur1', 'cle2' => 'valeur2'];
$redisClient->mset($donnees);
$redisClient->del(['cle1', 'cle2']);
?>
Recherche par motif
KEYS retourne les clés correspondant à un modèle donné.
<?php
$redisClient->mset(['produit:1' => 'pomme', 'produit:2' => 'poire', 'categorie:1' => 'fruits']);
var_dump($redisClient->keys('produit:*')); // ['produit:1', 'produit:2']
?>
Expiration temporelle
EXPIRE définit une durée de vie en secondes pour une clé.
<?php
$redisClient->set('session:123', 'donnees_session');
$redisClient->expire('session:123',132);
echo $redisClient->ttl('session:123'); // Affiche environ 130
?>
Manipulation de chaînes
Assignation conditionnelle
SETNX assigne une valeur uniquement si la clé n'existe pas.
<?php
if ($redisClient->setnx('verrou:compte', 'actif')) {
echo "Verrou acquis";
} else {
echo "Verrou déjà pris";
}
?>
Opérations numériques
INCR incrémente la valeur numérique d'une clé.
<?php
$redisClient->set('compteur:vues', 0);
$redisClient->incr('compteur:vues');
echo $redisClient->get('compteur:vues'); // Affiche: 1
?>
Gestion des hachages
Stockage d'objets
Les hachages permettent de stocker des objets structurés.
<?php
$utilisateur = [
'email' => 'contact@exemple.fr',
'nom' => 'Dupont',
'visites' => 5
];
$redisClient->hmset('utilisateur:456', $utilisateur);
echo $redisClient->hget('utilisateur:456', 'nom'); // Dupont
$redisClient->hincrby('utilisateur:456', 'visites', 1);
?>
Manipulation de listes
Files d'attente
Les listes peuvent servir de files d'attente simples.
<?php
// Ajout à la file
$redisClient->rpush('file:travaux', 'tache1');
$redisClient->rpush('file:travaux', 'tache2');
// Traitement FIFO
$tache = $redisClient->lpop('file:travaux');
echo "Traitement: $tache"; // tache1
?>
Ensembles et opérations
Ensembles uniques
Les ensembles garantissent l'unicité des éléments.
<?php
$redisClient->sadd('tags:article', 'php', 'redis', 'cache');
$redisClient->sadd('tags:article', 'php'); // Duplicat ignoré
$tags = $redisClient->smembers('tags:article');
print_r($tags); // ['php', 'redis', 'cache']
?>
Intersection d'ansembles
<?php
$redisClient->sadd('utilisateurs:actifs', 'u1', 'u2', 'u3');
$redisClient->sadd('utilisateurs:premium', 'u2', 'u3', 'u4');
$commun = $redisClient->sinter('utilisateurs:actifs', 'utilisateurs:premium');
print_r($commun); // ['u2', 'u3']
?>
Ensembles ordonnés
Scores et classements
Les ensembles ordonnés maintiennent les éléments triés par score.
<?php
$redisClient->zadd('classement:jeu', [
'joueur1' => 2500,
'joueur2' => 1800,
'joueur3' => 3100
]);
$top = $redisClient->zrevrange('classement:jeu', 0, 2, true);
print_r($top); // ['joueur3' => 3100, 'joueur1' => 2500, 'joueur2' => 1800]
?>
Transactions
Exécution atomique
Les transactions garantissent l'exécution séquetnielle de commandes.
<?php
$redisClient->watch('solde:compte');
$solde = $redisClient->get('solde:compte');
if ($solde >= 100) {
$redisClient->multi();
$redisClient->decrby('solde:compte', 100);
$redisClient->incr('transactions');
$resultat = $redisClient->exec();
if ($resultat) {
echo "Transaction réussie";
}
}
?>
Publication/Souscription
Messagerie simple
<?php
// Dans un script émetteur
$redisClient->publish('canal:alertes', 'Nouvelle mise à jour disponible');
// Dans un script récepteur (à exécuter séparément)
$redisClient->subscribe(['canal:alertes'], function ($redis, $canal, $message) {
echo "Reçu sur $canal: $message\n";
});
?>
Surveillance et débogage
Informations serveur
<?php
$info = $redisClient->info();
echo "Version Redis: " . $info['redis_version'] . "\n";
echo "Clients connectés: " . $info['connected_clients'] . "\n";
?>
Journal des commandes lentes
<?php
$logs = $redisClient->slowlog('get', 5);
foreach ($logs as $entree) {
echo "Commande: " . $entree[3] . " - Durée: " . $entree[2] . "μs\n";
}
?>