Skip to content

🗄️ Le cache avec Redis dans Drupal ​

Redis est un système de stockage de données en mémoire, utilisé ici comme backend de cache pour Drupal 11. En remplaçant le cache par défaut (base de données), Redis améliore significativement les performances en stockant les données en RAM.

Objectifs :

  • Installer et configurer Redis dans un environnement DDEV.
  • Comprendre la configuration gĂ©nĂ©rĂ©e automatiquement.
  • Savoir utiliser le CLI Redis pour inspecter et gĂ©rer le cache.

🧩 Présentation ​

Par défaut, Drupal stocke ses caches dans la base de données MySQL. Chaque requête de cache génère donc des requêtes SQL, ce qui ralentit l'application.

Redis (Remote Dictionary Server) est une base de données clé-valeur en mémoire. En déléguant le cache à Redis, on évite ces requêtes SQL coûteuses et on réduit considérablement le temps de réponse des pages.

ℹ️ Quand utiliser Redis ?

Redis est particulièrement utile sur des projets avec un volume de contenu important, des pages fréquemment visitées, ou des traitements en arrière-plan intensifs (Queue, Migrate, etc.).

⚙️ Installation de l'add-on Redis pour DDEV ​

DDEV propose un add-on officiel pour intégrer Redis directement dans l'environnement de développement.

shell
ddev add-on get ddev/ddev-redis
ddev restart

L'add-on va :

  • CrĂ©er un nouveau conteneur Docker dĂ©diĂ© Ă  Redis.
  • GĂ©nĂ©rer le fichier web/sites/default/settings.ddev.redis.php.
  • Rendre Redis accessible depuis le conteneur PHP de DDEV.

đź’ˇ Bonne pratique

Commitez le dossier .ddev/ dans votre dépôt Git. Cela permet à tous les membres de l'équipe d'avoir la même configuration Redis automatiquement après un ddev start.

📦 Installation du module Redis pour Drupal ​

Le module contrib Redis fournit l'intégration côté Drupal pour utiliser Redis comme backend de cache.

shell
ddev composer require drupal/redis
ddev drush en redis

⚠️ Attention

N'activez pas le module avant d'avoir configuré la connexion dans settings.php, sinon Drupal tentera de se connecter à Redis avec des paramètres invalides et affichera une erreur.

📄 Le fichier settings.ddev.redis.php ​

L'add-on DDEV génère automatiquement le fichier web/sites/default/settings.ddev.redis.php. Ce fichier contient la configuration de connexion à Redis ainsi que la configuration du module.

Voici le contenu typique de ce fichier :

php
<?php
// #ddev-generated
use Drupal\Core\Installer\InstallerKernel;

if (!InstallerKernel::installationAttempted() && extension_loaded('redis') && class_exists('Drupal\redis\ClientFactory')) {
  // Set Redis as the default backend for any cache bin not otherwise specified.
  $settings['cache']['default'] = 'cache.backend.redis';
  $settings['redis.connection']['host'] = 'redis';
  $settings['redis.connection']['port'] = 6379;

  // Apply changes to the container configuration to better leverage Redis.
  // This includes using Redis for the lock and flood control systems, as well
  // as the cache tag checksum. Alternatively, copy the contents of that file
  // to your project-specific services.yml file, modify as appropriate, and
  // remove this line.
  $settings['container_yamls'][] = 'modules/contrib/redis/example.services.yml';

  // Allow the services to work before the Redis module itself is enabled.
  $settings['container_yamls'][] = 'modules/contrib/redis/redis.services.yml';

  // Manually add the classloader path, this is required for the container cache bin definition below
  // and allows to use it without the redis module being enabled.
  $class_loader->addPsr4('Drupal\\redis\\', 'modules/contrib/redis/src');

  // Use redis for container cache.
  // The container cache is used to load the container definition itself, and
  // thus any configuration stored in the container itself is not available
  // yet. These lines force the container cache to use Redis rather than the
  // default SQL cache.
  $settings['bootstrap_container_definition'] = [
    'parameters' => [],
    'services' => [
      'redis.factory' => [
        'class' => 'Drupal\redis\ClientFactory',
      ],
      'cache.backend.redis' => [
        'class' => 'Drupal\redis\Cache\CacheBackendFactory',
        'arguments' => ['@redis.factory', '@cache_tags_provider.container', '@serialization.phpserialize'],
      ],
      'cache.container' => [
        'class' => '\Drupal\redis\Cache\PhpRedis',
        'factory' => ['@cache.backend.redis', 'get'],
        'arguments' => ['container'],
      ],
      'cache_tags_provider.container' => [
        'class' => 'Drupal\redis\Cache\RedisCacheTagsChecksum',
        'arguments' => ['@redis.factory'],
      ],
      'serialization.phpserialize' => [
        'class' => 'Drupal\Component\Serialization\PhpSerialize',
      ],
    ],
  ];
}

ℹ️ Le hostname redis

Dans l'environnement DDEV, le conteneur Redis est accessible via le hostname redis. Ce nom est résolu automatiquement par le réseau interne Docker.

🔧 Modifier settings.php pour préserver settings.local.php ​

Le fichier web/sites/default/settings.php inclut par défaut settings.local.php à la fin. Or, l'add-on DDEV ajoute ses propres inclusions (dont settings.ddev.redis.php) via settings.ddev.php, qui est inclus plus bas.

Si settings.local.php est chargé avant les fichiers DDEV, ses paramètres risquent d'être écrasés. Il faut donc s'assurer que settings.local.php est chargé en dernier.

Vérifiez que la fin de votre settings.php ressemble à ceci :

php
// Inclusions DDEV en premier (Redis, Mailpit, etc.)
if (file_exists($app_root . '/' . $site_path . '/settings.ddev.php')) {
  include $app_root . '/' . $site_path . '/settings.ddev.php';
}

// settings.local.php en dernier pour surcharger si nécessaire.
if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) {
  include $app_root . '/' . $site_path . '/settings.local.php';
}

⚠️ Ordre de chargement

Si settings.local.php est chargé avant settings.ddev.php, les paramètres de connexion Redis définis par DDEV seront ignorés, et le cache ne fonctionnera pas correctement.

đź’ˇ Bonne pratique

Ne commitez jamais settings.local.php dans Git. Ajoutez-le à votre .gitignore. Il doit contenir uniquement des surcharges locales à chaque développeur.

🖥️ Le CLI Redis ​

DDEV expose directement le CLI Redis via la commande ddev redis-cli, permettant d'inspecter et de gérer le cache en temps réel depuis le terminal.

shell
ddev redis-cli

🛠️ Les commandes utiles ​

Accédez au CLI Redis directement depuis DDEV :

shell
ddev redis-cli
CommandeDescription
PINGVérifier que Redis répond (PONG)
INFOAfficher les statistiques du serveur Redis
DBSIZEAfficher le nombre de clés stockées
KEYS *Lister toutes les clés (à éviter en production)
GET <clé>Lire la valeur d'une clé
DEL <clé>Supprimer une clé
FLUSHDBVider toute la base de données Redis courante
MONITORSurveiller les commandes en temps réel

🚨 FLUSHDB et FLUSHALL

FLUSHDB supprime toutes les données de la base courante. FLUSHALL supprime les données de toutes les bases. Ne jamais exécuter ces commandes en production sans en mesurer l'impact.

Commandes DDEV ​

CommandeDescription
ddev redis-cliOuvrir le CLI Redis
ddev logs -s redisAfficher les logs du conteneur Redis
Aller plus loin

Pour inspecter les clés de cache Drupal dans Redis, elles suivent le format <prefix>:<bin>:<cid>. Par exemple :

redis-cli KEYS "drupal:*"

Cela permet d'identifier rapidement quels bins de cache consomment le plus de mémoire.