Utiliser Redis avec Symfony

Pour quelle raison ?

C’est lors de l’utilisation de Victoire DCMS que la raison nous est apparu, Victoire stocke des réfèrences (il s’agit d’informations concernant une page comme son url ou son titre), ces données ne sont pas en base car elles peuvent représenter des données générées. Pour répondre à ce besoin le stockage était fait en XML, cela permettait une lecture simple et rapide des références. Mais ce système nous obligeait à réécrire le fichier à chaque modification d’une réfèrence et provoquait un ralentissement si beaucoup de réfèrences devaient être réécrites.

Suite à ce constat il est devenu indispensable de retravailler ce système de stockage pour en trouver un plus rapide en lecture et en écriture. La solution Redis est ainsi apparue car il s’agit d’une base de données in-memory clé-valeur. Sa documentation complète la rend facilement accessible et elle bénéficie d’un support important, ce qui la place comme une solution sur le long-terme.

Pour procéder à l’implémentation de Redis avec Symfony, cela se fait simplement grâce au bundle SncRedisBundle et la librairie PHP Redis Predis.

Installation de Redis :

wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make

Installation des vendors :

composer require snc/redis-bundle
composer require predis/predis

AppKernel :

new Snc\RedisBundle\SncRedisBundle(),

Configuration simple de SncRedisBundle :

Il suffit de lancer votre serveur Redis :

redis-server

Vous avez maintenant accès au service snc_redis.default pour utiliser Redis.

Que faire maintenant ?

Tout d’abord il faut normaliser la façon d’accès à Redis. Cela se fait par le biais d’un ORM. Il suffit d’implémenter un manager et un repository.

  • LE MANAGER

Il s’agit du service permettant la création, mise à jour et suppression des données. Cela nous permet ainsi d’accéder à des méthodes générique comme “create”, “update” et “delete”.

Exemple:

Ainsi on test si le hash est déjà existant avant de commencer le travail sur l’objet. On transforme tout d’abord l’objet en tableau pour pouvoir utiliser ses propriétés (un transformer différent peut être appelé selon la classe de l’objet). On appelle ensuite une méthode “redislize”, cette méthode permet de pouvoir persister nos valeurs car on ne peut sauvegarder que des strings et certains caractères provoquent des bugs (ex: espace).

Vous pouvez par ailleurs essayer d’utiliser la méthode “$this->redis->sadd($key . ’:’ . $value, $objectId);” Cela vous permettra de requêter avec une liste de paramètres vos données.

Bien sûr il faut éviter de persister les objets car sous forme serializer ils seront trop long, il faut implémenter une logique de relation si le besoin est nécessaire.

Pour décoder:

Nos propriétés sont donc ainsi persistées et prêtent à être lues.

  • LE REPOSITORY

Il s’agit du service permettant la lecture de la base. On peut implémenter ainsi une méthode getAll ou getById.

Pour vous aider vous pouvez vous créer une classe d’outils contenant les méthodes “redislize” et “unredislize”, ou de génération du hash selon l’objet envoyé,…

Vous avez maintenant accès à Redis en écriture et lecture facilement. Une implémentation des méthodes du manager dans un doctrine subscriber vous permettra de mettre à jour vos propre “réfèrences”. Pour lire votre serveur Redis n’hésitez pas à utiliser Redsmin, c’est un outils performant et facile d’utilisation.

Like what you read? Give Charlie Lucas a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.