Programmation PHP/Redis
Installation
[modifier | modifier le wikicode]Redis est comme Memcached, un système de gestion de base de données clef-valeur scalable, très hautes performances. En 2019, il devient plus utilisé que Memcached car il possède plus de fonctionnalités[1]. Par exemple il permet en plus une persistance sur la mémoire morte utile pour les reprises sur panne, autoriser les groupes de paires clé-valeur, et gère mieux le parallélisme[2].
Serveur
[modifier | modifier le wikicode]Pour l'installer :
sudo apt-get install redis-server
Obtenir la version :
redis-server -v Redis server v=6.2.5 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=19d2f4c94e0b6820
Client
[modifier | modifier le wikicode]sudo apt-get install redis
Sur Docker PHP :
RUN pecl install redis \ && docker-php-ext-enable redis
Sur WAMP :
- Télécharger le .dll sur https://pecl.php.net/package/redis
- L'extraire dans le dossier correspondant à la version de PHP. Ex : bin\php\php8.2.0\ext
- L'activer dans php.ini.
- Redémarrer WAMP.
Ensuite on le voit dans phpinfo.
Commandes
[modifier | modifier le wikicode]Pour se loguer au serveur Redis :
telnet nom_du_serveur 6379
Les commandes Redis les plus utiles[3] :
Lecture
[modifier | modifier le wikicode]- MONITOR : suivre l'activité du serveur en temps réel.
- KEYS * : liste des clés.
- GET : affiche la valeur de la clé en paramètre (ou
nil
si elle n'existe pas). - MGET : affiche les valeurs des clés en paramètre.
- QUIT : quitter.
Écriture
[modifier | modifier le wikicode]- SET : définit une valeur associée à la clé en paramètre[4].
- EXPIRE : définit une durée avant expiration pour la clé en paramètre, en secondes.
- SETEX : SET + EXPIRE[5].
- DEL : supprimer par le nom complet de la clé.
- FLUSHALL : vider toute la base de données.
Exemple de reset mémoire depuis le shell :
echo "FLUSHALL" | nc -q 1 localhost 6379
redis-cli
[modifier | modifier le wikicode]Pour afficher les clés de la base en shell :
redis-cli KEYS '*'
Par défaut, redis-cli
pointe sur 127.0.0.1. Pour regarder une autre machine :
redis-cli -h redis.example.com KEYS '*'
Supprimer des clés par leurs noms[6] (exemple de celles qui ont le préfixe "users:") :
redis-cli KEYS "users:*" | xargs redis-cli DEL
ou :
redis-cli --scan --pattern users:* | xargs redis-cli DEL
Plusieurs bases
[modifier | modifier le wikicode]Chaque instance de Redis peut accueillir jusqu'à 16 bases de données[7].
Elles sont accessibles par un suffixe dans leur DSN. Par défaut, redis://localhost:6379
pointe sur la base zéro : redis://localhost/0:6379
.
Utilisation en PHP
[modifier | modifier le wikicode]$redis = new \Redis();
$redis->connect('localhost', 6379);
$redis->set('nom du test', 'valeur du test');
echo $redis->get('nom du test');
predis
[modifier | modifier le wikicode]Cette bibliothèque permet d'utiliser Redis en clustering, avec des masters et slaves[8].
Dans Symfony
[modifier | modifier le wikicode]Dans le framework PHP Symfony.
Session
[modifier | modifier le wikicode]SncRedisBundle
[modifier | modifier le wikicode]Avant Symfony 4.1, il fallait passer par un bundle tel que SncRedisBundle[9].
Depuis :
composer require snc/redis-bundle predis/predis
Pour que les sessions soient stockées dans Redis au lieu de var/cache/, remplacer dans framework.yaml, session.handler_id:
null par snc_redis.session.handler. Cela permet par exemple de les partager entre plusieurs conteneurs.
RedisSessionHandler
[modifier | modifier le wikicode]Depuis Symfony 4.1, le composant HttpFoundation contient une classe RedisSessionHandler[10].
Installation dans services.yaml :
redis:
class: Redis
calls:
- connect:
- '%env(REDIS_HOST)%'
- '%env(int:REDIS_PORT)%'
Symfony\Component\HttpFoundation\Session\Storage\Handler\RedisSessionHandler:
arguments:
- '@redis'
Puis dans config/packages/framework.yaml[11] :
framework:
session:
handler_id: Symfony\Component\HttpFoundation\Session\Storage\Handler\RedisSessionHandler
Ensuite le service session utilisera automatiquement Redis.
Doctrine
[modifier | modifier le wikicode]Pour mettre le cache Doctrine de requête et de résultat dans Redis, on peut utiliser SncRedisBundle[12][13].
Pour vider les caches :
bin/console cache:pool:clear doctrine.query_cache_pool doctrine.result_cache_pool doctrine.system_cache_pool
Cache chainé
[modifier | modifier le wikicode]L'inconvénient de Redis ainsi configuré est que s'il tombe en panne, les applications qui l'utilisent crashent aussi (erreur de connexion à Redis dès l'instanciation des services).
Pour se prémunir de cela, il est recommandé d'inclure Redis dans un cache chainé, qui permet de basculer automatiquement sur des caches de secours sans bloquer l'application. Exemple[14] :
# cache.yaml
framework:
cache:
prefix_seed: my_app_
app: cache.chain
pools:
cache.chain:
adapter: cache.adapter.psr6
provider: chain_adapter_provider
cache.redis:
adapter: cache.adapter.redis
cache.apcu:
adapter: cache.adapter.apcu
cache.filesystem:
adapter: cache.adapter.filesystem
# services.yaml
services:
chain_adapter_provider:
class: Symfony\Component\Cache\Adapter\ChainAdapter
arguments:
- ['@cache.redis', '@cache.apcu', '@cache.filesystem']
- '%env(int:CACHE_DEFAULT_LIFETIME)%'
Références
[modifier | modifier le wikicode]- ↑ https://aws.amazon.com/fr/elasticache/redis-vs-memcached/
- ↑ https://www.disko.fr/reflexions/technique/redis-vs-memcached/
- ↑ https://redis.io/commands
- ↑ https://redis.io/commands/set/
- ↑ https://redis.io/commands/setex/
- ↑ https://rdbtools.com/blog/redis-delete-keys-matching-pattern-using-scan/
- ↑ https://www.mikeperham.com/2015/09/24/storing-data-with-redis/
- ↑ https://github.com/predis/predis
- ↑ https://github.com/snc/SncRedisBundle/blob/master/Resources/doc/index.md
- ↑ https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/RedisSessionHandler.php
- ↑ https://symfony.com/doc/current/session/database.html
- ↑ https://kunicmarko20.github.io/2017/07/20/Doctrine-Second-Level-Cache-with-Translations-and-Redis.html
- ↑ https://github.com/snc/SncRedisBundle/issues/554
- ↑ https://symfony.com/doc/current/components/cache/adapters/chain_adapter.html