Redis est une banque de données en mémoire open source utilisée comme base de données, cache et même courtier de messages. Redis peut être utilisé facilement avec Docker et Docker-Compose pour le développement local en tant que cache pour une application Web. Dans cet article, nous allons configurer Redis avec docker et docker-compose, où Redis sera utilisé comme cache pour une API REST Node.js/Express.js avec PostgreSQL comme base de données principale, commençons !
Table des matières #
Conditions préalables #
Avant de commencer à examiner le code, voici quelques bonnes conditions préalables :
- Une connaissance générale du fonctionnement de Docker serait un avantage.
- Il est prévu qu’il ait suivi le didacticiel Node.js Postgres avec les API de citations.
- Passer par la publication Node.js Redis serait très bénéfique.
- Toute connaissance pratique de Redis, de sa ligne de commande et de certaines commandes de base telles que KEYS, MGET serait utile.
Étant donné que cela est mentionné, nous pouvons maintenant commencer par exécuter Redis avec uniquement Docker.
Retour et Docker#
Redis, comme mentionné, peut également être utilisé comme cache. Pour cet article, nous utiliserons Redis comme cache en mémoire au lieu d’obtenir les données d’une base de données Postgres. Pour ce faire, nous utiliserons l’image docker officielle Redis de Dockerhub. Pour exécuter la version Redis 6.2 sur un conteneur Alpine, nous exécuterons la commande suivante :
docker run --rm --name test-redis redis:6.2-alpine redis-server --loglevel warning
La commande ci-dessus démarrera un conteneur nommé test-redis
pour la version d’image donnée de 6.2-alpine` avec le niveau de journalisation d’avertissement. Cela donnera le résultat suivant :
Pour exécuter certaines commandes Redis à l’intérieur du conteneur, nous pouvons exécuter docker exec -it test-redis redis-cli
ce qui exécutera le redis-cli dans le conteneur en cours d’exécution. Nous pouvons essayer quelques commandes Redis comme ci-dessous pour voir que les choses fonctionnent :
Comme vu ci-dessus, nous pourrions définir une valeur avec la clé test
et la récupérer. Comme aucun volume n’est défini ni aucune commande donnée pour persister, les clés et les valeurs seront perdues lorsque le conteneur s’arrêtera. Si vous recherchez une base de données relationnelle avec docker, essayez ce tutoriel sur PostgreSQL et Docker. Ensuite, nous examinerons la possibilité d’exécuter la même version de Redis avec docker-compose.
Redis avec Docker-compose #
Pour exécuter Redis avec Docker-compose, y compris la persistance et l’authentification, nous utiliserons le fichier docker-compose nommé docker-compose-redis-only.yml
comme indiqué ci-dessous :
version: '3.8'
services:
cache:
image: redis:6.2-alpine
restart: always
ports:
- '6379:6379'
command: redis-server --save 20 1 --loglevel warning --requirepass eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81
volumes:
- cache:/data
volumes:
cache:
driver: local
Ici, dans le fichier docker-compose ci-dessus, nous avons défini un service appelé cache. Le service de cache extraira l’ redis:6.2.alpine
image de Dockerhub. Il est configuré pour redémarrer toujours, si le conteneur Docker échoue pour une raison quelconque, il redémarrera. Ensuite, nous mappons le port du conteneur 6379
au port local 6379
. Si nous souhaitons exécuter plusieurs versions de Redis, nous pouvons choisir un port aléatoire.
Par conséquent, nous utilisons une redis-server
commande personnalisée --save 20 1
qui demande au serveur de sauvegarder 1 ou plusieurs écritures toutes les 20 secondes sur le disque au cas où le serveur redémarrerait. Nous utilisons le --requirepass
paramètre pour ajouter une authentification avec le mot de passe pour lire/écrire des données sur le serveur Redis. Comme nous le savons, s’il s’agissait d’une application de production, le mot de passe ne sera pas divulgué. Ceci est fait ici parce que cela est uniquement destiné à des fins de développement.
Par la suite, nous utilisons un volume pour lequel /data
toutes les écritures seront conservées. Il est mappé sur un volume appelé cache
. Ce volume est géré en tant que pilote local, vous pouvez en savoir plus sur le pilote de volume Docker si vous le souhaitez.
Si nous exécutons un docker-compose up avec le fichier ci-dessus, l’utiliser docker-compose -f docker-compose-redis-only.yml up
donnera un résultat comme ci-dessous :
Ce conteneur fonctionne de la même manière que celui ci-dessus. Les deux principales différences ici sont que le volume est monté pour conserver les données enregistrées lors des redémarrages du conteneur et que le mot de passe est fourni pour l’authentification. Dans la section suivante, nous ajouterons Redis à une application existante disposant d’une base de données PostgreSQL et d’une API Node.js utilisant cette base de données.
Ajouter Redis à une application Node.js existante #
À titre d’exemple pour ce guide, nous utilisons l’application API Quotes construite avec Node.js et Postgres. Nous allons introduire le service Redis dans le fichier docker-compose existant comme suit :
version: '3.8'
services:
db:
image: postgres:14.1-alpine
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- '5432:5432'
volumes:
- db:/var/lib/postgresql/data
- ./db/init.sql:/docker-entrypoint-initdb.d/create_tables.sql
cache:
image: redis:6.2-alpine
restart: always
ports:
- '6379:6379'
command: redis-server --save 20 1 --loglevel warning --requirepass eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81
volumes:
- cache:/data
api:
container_name: quotes-api
build:
context: ./
target: production
image: quotes-api
depends_on:
- db
- cache
ports:
- 3000:3000
environment:
NODE_ENV: production
DB_HOST: db
DB_PORT: 5432
DB_USER: postgres
DB_PASSWORD: postgres
DB_NAME: postgres
REDIS_HOST: cache
REDIS_PORT: 6379
REDIS_PASSWORD: eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81
links:
- db
- cache
volumes:
- ./:/src
volumes:
db:
driver: local
cache:
driver: local
Ce fichier est similaire au fichier docker-compose ci-dessus. Les principaux changements ici sont que le api
service dépend désormais également du cache
service qui est notre serveur Redis. En plus de cela, dans le service API, nous transmettons les informations d’identification liées à Redis en tant que variables d’environnement supplémentaires telles que REDIS_HOST
, REDIS_PORT
et REDIS_PASSWORD
. Ces parties ont été mises en évidence dans le fichier ci-dessus. Vous pouvez utiliser les variables d’environnement docker compose pour en savoir plus sur l’utilisation des variables d’environnement avec docker-compose.
Lorsque nous effectuons une opération régulière docker-compose up
avec ce fichier docker-compose.yml, nous obtiendrons un résultat similaire à celui ci-dessous :
Selon que le conteneur Postgres contient des données, il se comportera un peu différemment. Maintenant, si nous frappons http://localhost:3000/quotes/author/chris
, le résultat suivant s’affichera :
Actualisez cette page 2 à 3 fois et revenez à l’onglet de la console docker-compose, nous devrions voir quelque chose de similaire à ce qui suit :
Comme nous pouvons le voir ci-dessus, le premier accès a été envoyé à la base de données et il a fallu 328,118 ms pour obtenir les citations de l’auteur Chris
. Toutes les requêtes ultérieures ont reçu la requête du cache Redis et elle a été ultra rapide, répondant entre 5,7 et 3,48 ms. Comme le contenu mis en cache est là pendant 10 minutes, si nous exécutons l’ redis-cli
intérieur du conteneur avec la commande suivante :
docker exec -it nodejs-posgresql_cache_1 redis-cli -a eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81
Ensuite nous pouvons voir le contenu de la clé mise en cache et sa valeur avec : KEYS *
pour lister toutes les clés. Pour lister la valeur de la clé trouvée que nous pouvons utiliser, MGET quotes_author_chris_1
elle nous montrera le contenu de cette clé particulière comme indiqué ci-dessous :
Le cache de requêtes PostgreSQL accélérera les choses pour les appels ultérieurs, mais s’il y a beaucoup (des milliers ou des millions) de lignes dans la base de données, le cache de requêtes ne fonctionnera pas très bien. C’est là qu’un cache clé-valeur stocké en mémoire comme Redis constituerait une amélioration considérable des performances, comme vous pouvez le voir ci-dessus. La modification effectuée pour ce didacticiel est disponible sous forme de pull request pour votre référence.
Conclusion #
Nous avons vu comment utiliser Redis avec docker et avec docker-compose. Nous avons également ajouté Redis comme cache à une API Node.js existante et avons constaté les avantages en termes de performances.
J’espère que cela vous aidera à comprendre comment utiliser Redis dans n’importe quelle application avec docker et docker-compose sans aucun problème.
Continuez à mettre en cache !