Redis, une base clé-valeur très riche

Redis fait partie de la famille des bases de données « NoSQL« . Il s’agit d’une base « clé-valeur » ultra-rapide, et agrémentée de fonctionnalités avancées qui couvrent un large panel de besoins.
Un outil à avoir dans sa besace, qui trouvera facilement sa place dans votre architecture.

Les bases « clé-valeur »

Le principe des bases clé-valeur est de stocker les données sous une forme triviale « clé » (chaîne de caractères) ? « valeur scalaire » (chaîne de caractère ou nombre).

Les fonctions principales du langage seront donc :

  • SET key value ? « OK » ;
  • GET key ? « value » ;

C’est simple, efficace, et pratique dans de nombreux cas en remplacement de bases de données relationnelles traditionnelles.

Cas réels d’utilisation des bases clé-valeur

Si le SQL a de beaux jours devant lui, la simplification du stockage peut parfois apporter une vraie valeur. Concrètement, si vous n’avez pas de lourdes relations entre vos entités, et des objets peu complexes, alors il est fort probable que l’utilisation d’une base clé-valeur soit pertinente. Quelques exemples :

Redis

Redis est un projet Open Source, développé par Salvatore Sanfilippo, à l’origine avec l’objectif assumé d’être une espèce de Memcache persistant. Son principe est simple :

  • Tout est stocké en mémoire ;
  • De temps en temps((au bout d’un certain nombre d’écritures, ou au bout d’un certain temps)) on écrit un « snapshot » des données sur le disque ;
  • Au démarrage du service, on récupère le dernier snapshot persisté et on le replace en mémoire.

Aujourd’hui, la dernière version Redis 2.2.5 est prête pour l’utilisation en production, stable, performante, et pourvue de nombreuses fonctionnalités.

Les performances

Redis est performant, très performant. Et s’il n’est pas assez performant, vous pourrez envisager un cluster. La réplication master-slave est quant à elle intégrée en natif.

Intégration dans votre projet

Il existe un client en ligne de commande, redis-cli, mais également des clients natifs pour de nombreux langages (C, C#, PHP, Ruby, Java, Javascript…). Un comparatif des librairies de connexion à Redis en PHP est disponible sur GitHub.

Exemple en PHP avec phpredis :

// Initialisation client
$redis = new Redis() ;
// Connexion
$redis->connect('127.0.0.1', 6379) or throw new Exception('Connection failed') ;
// Définition d'une valeur
$redis->set('coucou', 'gamin') or throw new Exception('Failed setting key "coucou"') ;
// Récupération d'une valeur définie
echo $redis->get('coucou') ;

Les commandes disponibles

Redis dispose de nombreuses commandes, lui permettant de manipuler différents types de données :
– Les chaînes de caractères (du simple SET jusqu’à la possibilité de remplacer une portion d’une valeur via SETRANGE) ;
– Les listes triées (sorted sets : à chaque valeur un score est attribué, et la liste est maintenue ordonnée suivant ce score) ;
– Les listes non triées (sets, des données en vrac, sans ordre garanti, mais sur lesquelles la plupart des opérations se feront en temps constant) ;
– Les piles (lists) ;
– Les hashs (hashes, permettant de stocker des « sous-clés ») ;

On peut également manipuler les clés ? : faire des recherches, leur donner une date d’expiration (pour utiliser Redis en remplacement de Memcache par exemple, ou pour stocker des sessions utilisateurs).

Exemple d’utilisation de Hash pour stocker les préférences des utilisateurs

# Utilisateur id 42
# Stockage des préférences "color", "name", et "isactive" en une commande
HMSET pref:42 color "red" name "John Connor" isactive "false"
OK
# Récupération des préférences "color" et "name"
HMGET pref:42 color name
1) "red"
2) "John Connor"

Note sur l’incrémentation

Le fait de pouvoir incrémenter de manière atomique est toujours intéressant, et n’est jamais chose facile en SQL (sauf à disposer de séquences). Redis répond à cette problématique à l’aide de la commande INCR qui va incrémenter la valeur et retourner la nouvelle valeur, qu’on peut donc utiliser sereinement.

Une petite commande très pratique donc pour gérer des identifiants ! ;)

Le push

Il s’agit d’une fonctionnalité un peu « hors périmètre » de Redis, mais extrêmement puissante ! Redis peut devenir, ni plus ni moins, un système de messagerie instantanée (push) via les commandes PUB/SUB !

  • Un client va s’inscrire à différents « topics » ;
  • Un autre client va publier un message sur un topic ;
  • Tous les clients inscrits à ce topic, recevront « en push » le message publié.

Bien sûr, ça marche mieux avec des scripts qui tournent en continu, et c’est plutôt proche de l’orienté événement. Bref, on dirait que c’est fait pour Node.js (vous la voyez là, la combo avec socket.io pour les applications Web temps réel  ?), mais la plupart des clients gèrent ces fonctionnalités d’inscription/publication.

Ce que vous ne trouverez pas

Oubliez les relations entre entités, ça n’existe pas ici.

Oubliez également, et là ça peut être plus gênant, les notions d’utilisateur et de permissions. On peut aussi oublier les notions de « bases de données ».

  • Au mieux, le serveur peut être sécurisé par un mot de passe, unique, qu’on doit fournir via la commande AUTH.
  • On peut sélectionner une « base » de données, sous la forme d’un entier (par défaut il y a 16 bases disponibles, numérotées de 0 à 15). Il n’est pas possible de les nommer.

Concrètement, faire du Redis mutualisé n’est donc pas une problématique triviale.

Conclusion

Les bases clé-valeur, et Redis en particulier, méritent votre attention. Avant de foncer sur du SQL pour tout stocker, il peut être intéressant de ne pas tout miser sur le même cheval, et d’utiliser les bons outils là où ils sont les plus pertinents.

Et Redis, dans son genre, est très fort :)