Sur les serveurs d'hébergement, la fonctionnalité « Redis Eviction » détermine quelles clés doivent être supprimées et lesquelles doivent rester dans le cache lorsque la mémoire vive vient à manquer, afin que les requêtes soient traitées rapidement et de manière fiable. Je vais te présenter des stratégies concrètes pour t'aider à choisir la politique la plus adaptée, configurer et en assurant un suivi.
Points centraux
Avant d'entrer dans les détails, je vais résumer brièvement les principales orientations à suivre afin que tu puisses Politique définir rapidement. Les points suivants s'adressent aux administrateurs d'hébergement, aux DevOps et aux exploitants de sites web soucieux des performances. Je prends en compte les charges de travail typiques, allant du cache pur à des ensembles de données mixtes avec TTL et clés persistantes. Cela te permet de maintenir le bon équilibre entre taux de mise en cache, sécurité des données et prévisibilité. Grâce à ces principes clés, tu prendras une clair Choisis ton serveur.
- Allkeys-LFU: Pour les charges de travail de cache de grande envergure présentant des accès très inégalement répartis.
- Allkeys-LRU: Pour un contenu actualisé et un comportement facilement prévisible.
- Volatile-LRU/LFU: Supprime uniquement les clés TTL, protège les données persistantes.
- Noeviction: Pour les données critiques ; une erreur de saisie plutôt qu'une perte de clé.
- Suivi: Surveiller en permanence le taux de réussite, la mémoire et les évictions.
Que signifie concrètement « Redis Eviction » ?
On entend par « éviction Redis » la suppression de clés dès que la valeur définie maxmemory est atteinte et que Redis doit libérer de l'espace pour permettre l'écriture de nouvelles données. Je contrôle ce comportement via le paramètre maxmemory-policy, les options telles que allkeys-lru, allkeys-lfu, allkeys-random ou la volatile-*-propose plusieurs variantes ; chaque option donne la priorité à des clés différentes lors de la suppression. LRU protège les clés utilisées en dernier, LFU privilégie les données fréquemment utilisées, Random effectue une sélection aléatoire par échantillonnage, et les politiques « volatile » ne prennent en compte que les clés dotées d'un délai d'expiration (TTL). Important : Redis prend ses décisions de suppression de manière performante par échantillonnage, ce qui maintient une faible latence et assure la fiabilité du système. contrôle. Ce n'est que lorsque la mémoire vient à manquer que l'éviction intervient ; jusque-là, Redis se comporte comme un système de stockage de données en mémoire classique avec Cache-Avantages.
Choix de la politique adaptée pour les serveurs d'hébergement
La meilleure stratégie consiste à déterminer quelles données doivent rester en mémoire et lesquelles le système peut recalculer. Si Redis sert exclusivement de cache, une stratégie « allkeys » convient, car chaque entrée peut, en cas de doute, être recréée à partir de la source d'origine ; c'est là que allkeys-lfu en cas d'accès inégaux et allkeys-lru pour les contenus relativement récents. Si l'instance contient des données hétérogènes, je préfère volatile-lru ou volatile-lfu, afin que seules les clés TTL soient supprimées et que les données permanentes ne soient pas affectées. Si les données sont critiques, je privilégie noeviction, mais j'accepte en contrepartie que les commandes d'écriture échouent lorsque la mémoire est saturée et que l'application doit réagir correctement. Cette logique de décision simple rend le fonctionnement prévisible, minimise le risque d'erreur et m'offre une vision claire Glissière de sécurité.
Guide pratique : charges de travail « cache-only » vs charges de travail mixtes
Pour les charges de travail exclusivement basées sur le cache, je vise un taux de réussite élevé et j'accepte que les évictions ne présentent pratiquement aucun risque, car les données sont rapidement rechargées depuis la source principale. Dans de tels environnements, allkeys-lfu constitue souvent le meilleur compromis, car les objets fréquemment utilisés restent longtemps en mémoire, tandis que les données secondaires sont supprimées. Si l'on privilégie l'actualité, on choisit allkeys-lru, afin de privilégier les entrées les plus récemment utilisées et de conserver des fragments de page récents. Pour les ensembles mixtes, j'utilise le TTL sur toutes les clés de cache et je combine cela avec volatile-lru ou volatile-lfu, afin que seules les données „ éphémères “ soient supprimées. Un bon paramétrage du stockage facilite ce choix ; je donne d'autres conseils dans mon guide Configurer la mémoire de manière optimale, qui met en lumière les réserves et les indicateurs concrets de Maxmemory.
LRU ou LFU : quelle méthode choisir dans quel cas ?
L'algorithme LRU (Least Recently Used) donne la priorité à la date de la dernière utilisation et garantit la conservation des contenus récemment consultés. L'algorithme LFU (Least Frequently Used) comptabilise la fréquence d'accès et préserve ainsi les „ valeurs sûres “, même si elles n'ont pas été consultées ces dernières minutes ; ce qui s’avère particulièrement avantageux en cas de consultations très irrégulières. Si le comportement des utilisateurs évolue rapidement, par exemple pour les actualités ou les campagnes, cela a pour effet allkeys-lru plus intuitif, car il met davantage l'accent sur l'activité en cours. Il séduit par ses schémas récurrents et stables, tels que les menus, les widgets de la page d'accueil ou les données liées à la connexion allkeys-lfu, car les contenus restent disponibles en permanence. Afin d'éviter toute erreur d'appréciation, je vérifie régulièrement le taux de réussite, le taux d'éviction et les temps de réponse, car ces chiffres reflètent la situation réelle Utilisez fiable.
Réglage fin pour LRU/LFU
Pour que les LRU/LFU fonctionnent avec précision, je règle trois vis de réglage : maxmemory-samples, lfu-log-factor et lfu-temps-de-décay. Plus élevé maxmemory-samplesLes valeurs (par exemple 10–15 au lieu de la valeur par défaut) améliorent la qualité de l'échantillonnage lors des évictions et augmentent ainsi le taux de réussite des clés „ correctes “, mais elles sollicitent davantage le processeur. lfu-log-factor détermine la vitesse à laquelle le compteur LFU augmente : les petites valeurs réagissent rapidement (idéal pour les phénomènes éphémères), tandis que les grandes valeurs lissent la courbe (mieux adaptées aux „ poids lourds “ durables). Avec lfu-temps-de-décay (en minutes) : je définis à quelle vitesse l'ancienne popularité „ diminue “ ; les valeurs élevées conviennent aux tendances quotidiennes, tandis que les valeurs plus faibles sont adaptées aux contenus qui évoluent rapidement. Je ne modifie qu’un seul paramètre par itération, j’observe le taux de réussite et je surveille la latence afin de ne pas surcharger inutilement le processeur lors des échantillonnages.
Stratégies TTL avec volatile-*
Les politiques basées sur le TTL, telles que volatile-lru et volatile-lfu limitent les suppressions aux clés dotées d’une durée de vie et laissent les clés „ permanentes “ intactes. Cela convient aux configurations dans lesquelles Redis regroupe des données de cache et des données persistantes, par exemple des informations de type session à côté des caches de requêtes. Si je définis systématiquement des TTL sur toutes les clés de cache, je peux m’assurer que les évictions n’ont lieu que là où je le prévois. Attention : si la base de données ne contient aucune clé TTL, les politiques « volatile » se comportent comme noeviction, c'est-à-dire sans effacement et avec des erreurs d'écriture potentielles lorsque la mémoire est pleine. C'est pourquoi je vérifie régulièrement si tous les objets du cache ont une durée de vie raisonnable et si les délais jusqu'à la Actualité qui correspondent au contenu.
En complément, j'utilise cette option pour les contenus dont la durée de validité est clairement limitée volatile-ttl, ce qui fait que les clés dont la durée de validité restante est la plus courte sont supprimées en premier. Cela s'avère utile lorsque tous les objets du cache doivent de toute façon être renouvelés prochainement et que je souhaite utiliser la date d'expiration „ naturelle “ comme critère de priorité. Pour les tests ou l'environnement de préproduction, j'utilise parfois volatile-random afin de minimiser la charge du processeur ; en production, j'évite les variantes aléatoires car elles sont moins prévisibles.
Noeviction pour les données critiques
À l'adresse suivante : noeviction Redis ne supprime pas les clés ; les accès en lecture restent possibles, tandis que les commandes d'écriture peuvent échouer dès que la limite de mémoire est atteinte. Cela protège les données critiques contre toute suppression involontaire, mais exige de l'application une gestion robuste des messages d'erreur et, le cas échéant, de la contre-pression. J'utilise « noeviction » lorsque les pertes de cache seraient plus coûteuses que des erreurs d'écriture temporaires, par exemple pour les paramètres liés à la sécurité ou les informations de session hautement sensibles. Il reste important de prévoir une planification conservatrice de la mémoire avec une réserve, afin que les pics de charge ne se traduisent pas immédiatement par des erreurs et que la Application continue de réagir. De plus, je déclenche activement une alerte via le système de surveillance avant que le seuil ne soit atteint, afin de pouvoir réagir à temps lutter contre.
Persistance, réplication et mémoire tampon
Les décisions d'éviction doivent toujours être prises en tenant compte de la persistance (RDB/AOF) et de la réplication. Les instantanés RDB et les réécritures AOF utilisent le principe « copy-on-write » ; pendant ce temps, l'espace de stockage RSS augmente temporairement. Je prévois donc une marge de 25 à 501 TP3T au-dessus du pic observé, afin qu’une réécriture ne déclenche pas involontairement des évictions. L’ordre de grandeur dépend du taux d’écriture et de la taille des objets ; plus le nombre d’objets modifiés pendant la réécriture est élevé, plus les besoins sont importants.
Lors de la réplication, je tiens compte du taille-du-backlog-de-réplication ainsi que les tampons de sortie pour les répliques. Point particulièrement important : j'utilise souvent des répliques replica-ignore-maxmemory yes (anciennement slave-ignore-maxmemory), afin que le serveur réplique ne soit pas évincé de lui-même lors des pics de charge, alors qu'il suit le serveur principal. En revanche, pour les répliques de lecture servant de cache, je peux activer délibérément une politique d'éviction si je dois limiter strictement l'espace de stockage. Pour les données critiques, j'ai tendance à associer sur les répliques noeviction avec une marge suffisante pour éviter tout écart dans les données.
Configuration dans le fichier redis.conf et à l'exécution
Je travaille de manière reproductible avec des paramètres clairs et je les enregistre de façon permanente :
# Exemple : cache uniquement, accès inégaux
maxmemory 4gb
maxmemory-policy allkeys-lfu
maxmemory-samples 10
lfu-log-factor 10
lfu-decay-time 1
# Suppressions en arrière-plan facultatives (voir Lazyfree)
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
Au moment de l'exécution, je teste les modifications avec CONFIG SET et note-les avec REÉCRITURE DE LA CONFIGURATION de manière permanente dans le fichier de configuration. Pour les charges de travail mixtes, je documente les règles TTL dans le code et je sépare les instances Redis en fonction de leur usage (par exemple, cache distinct vs sessions), afin que chaque instance puisse appliquer une politique ciblée.
Lazyfree : évictions sans pics de latence
Les clés volumineuses ou les suppressions en masse entraînent rapidement et simultanément des pics de latence. Avec Lazyfree (lazyfree-lazy-eviction, lazyfree-lazy-expire, lazyfree-lazy-server-del) je déplace la libération des objets volumineux vers des threads d'arrière-plan ; des commandes telles que UNLINK au lieu de DEL en tirent également parti. Résultat : des temps de réponse plus stables pour des charges de travail identiques. Je surveille la mémoire et le processeur, car les libérations en arrière-plan peuvent générer une surcharge temporaire.
Suivi et indicateurs clés : taux de réussite, mémoire, expulsions
La réussite d'une installation dépend entièrement de sa visibilité : je mesure la Taux de succès, le taux d'éviction, la latence et l'espace mémoire utilisé au fil du temps. Si le taux d'éviction augmente alors que le taux de réussite diminue, ces chiffres indiquent un manque de mémoire, des TTL incorrects ou une politique inadaptée. Aux heures de pointe, j’évalue également les taux d’erreur des commandes d’écriture afin d’identifier directement les risques de « noeviction ». Les échantillons internes à Redis pour LRU/LFU peuvent être consultés via maxmemory-samples ajuster ; des valeurs plus élevées permettent de prendre de meilleures décisions, mais consomment un peu de ressources CPU. J'augmente cette valeur avec modération, j'observe l'impact sur les temps de réponse et je recherche ainsi la meilleure Réglage pour la charge de travail.
Exemples de configurations pour les serveurs d'hébergement
Pour les scénarios d'hébergement récurrents, j'ai constaté qu'une petite matrice s'avérait très utile : je m'en sers comme point de départ, puis je l'affine en fonction des mesures. Je prévois toujours une marge de sécurité au niveau de maxmemory, afin d'amortir les pics de charge et de garantir que les évictions se déroulent de manière ordonnée. Pour cela, je choisis la politique en fonction de la charge de travail, conformément au tableau ci-dessous, et je documente clairement les règles de TTL dans l'application. Cette approche évite les malentendus entre les équipes de développement et d'exploitation et garantit un comportement reproductible au quotidien. Grâce à une telle vue d’ensemble, je maintiens ma Décisions transparente et permet de les retrouver plus facilement par la suite adapter.
| Charge de travail | Politique recommandée | Avantage | Risque | Remarque |
|---|---|---|---|---|
| Cache pur, accès inégaux | allkeys-lfu | Les objets fréquemment utilisés restent | Les clés rares apparaissent plus rapidement | Vérifier le taux de réussite, maxmemory-samples régler avec précision |
| Cache seul, contenu à jour | allkeys-lru | Conserver les clés utilisées récemment | Les valeurs sûres de longue date ont tendance à baisser | Souvent plus adapté aux actualités et aux campagnes |
| Données mixtes avec TTL | volatile-lru/lfu | Clés permanentes protégées | Sans TTL, pas de suppression | Appliquer et documenter systématiquement le TTL |
| Stockage des données critiques | noeviction | Pas de perte de clés | Erreurs d'écriture lorsque la mémoire vive est pleine | Garantir la gestion des erreurs de l'application |
| Test/Environnement de préproduction | allkeys-random | Très faible charge du processeur | Expulsions imprévisibles | Ne pas utiliser dans les caches de production |
Redis mutualisé ou dédié dans l'hébergement
Dans les environnements partagés, tu es souvent confronté à des profils de charge fluctuants et à des règles TTL floues propres à d'autres projets, ce qui peut rendre les évictions imprévisibles. Je préfère utiliser ici volatile-lru ou volatile-lfu et définissez des TTL courts et précis pour toutes les clés de cache, afin que seules les données explicitement éphémères soient supprimées. Dans les caches dédiés haute performance, cela permet allkeys-lfu souvent de meilleurs taux de réussite et des temps de réponse plus stables, car les „ Heavy-Hitter “ restent de manière fiable dans la mémoire vive. Si vous hésitez encore, consultez mon guide sur Partagé vs. Dédié, où je compare les effets sur les performances, l'isolation et les coûts. Grâce à cette clarté, je réduis le risque de défaillances latérales et je maintiens la Latence en main.
Redis n'applique pas nativement les quotas par client. Si j'ai besoin de budgets de stockage stricts, je lance des instances distinctes ou des shards de cluster par projet et je définis pour chaque instance son propre maxmemory ainsi qu'une politique adaptée. Cela me permet d'empêcher que certains locataires ne monopolisent la mémoire partagée et ne provoquent involontairement des évictions chez d'autres.
WordPress et WooCommerce : bien gérer le cache d'objets
Dans les installations WordPress, les résultats de requêtes, les menus, les informations de connexion et les données transitoires sont souvent stockés dans le cache d'objets Redis ; ces clés se prêtent parfaitement à des règles basées sur la durée de vie (TTL). Pour les pages dynamiques, je définis des durées de vie courtes pour les contenus éphémères, afin que volatile-lfu ou volatile-lru libérer de l'espace de manière ciblée. Si la page contient beaucoup d'éléments récurrents, cela convainc allkeys-lfu, car les „ éléments persistants “ restent en mémoire et le taux de mise en cache reste élevé. J'explique ici les erreurs courantes dans le cache d'objets : Erreur de configuration dans le cache d'objets, j'y aborde les notions de TTL, d'espaces de noms et de taille de clé. Grâce à ces ajustements, j'évite les échecs inutiles et je maintiens le site opérationnel lors des pics de trafic rapide.
Conseils pratiques : pour les fragments très volatils (par exemple, les widgets personnalisés, les extraits du panier), je choisis des TTL compris entre quelques secondes et quelques minutes. Pour les structures de menu, les catégories ou les widgets de la page d'accueil, des TTL plus longs sont recommandés, à condition qu'un invalidateur de cache se déclenche de manière fiable en cas de modifications. Les catalogues WooCommerce bénéficient souvent de tâches de préchauffage (Cron) qui remplissent de manière ciblée les listes de produits phares après un vidage du cache. Veillez également à ce que les plugins n’écrivent pas d’objets surdimensionnés dans le cache d’objets ; si nécessaire, granulisez les données (plusieurs clés plus petites au lieu d’un énorme bloc) et allégez les formats de données.
Optimisation du système d'exploitation et des conteneurs
Les paramètres par défaut du système d'exploitation et des conteneurs influencent indirectement les évictions par le biais de la disponibilité de la mémoire et du comportement RSS. Je définis vm.overcommit_memory=1, désactivez les Transparent Huge Pages (THP) et évitez l'utilisation de la mémoire swap dans les caches de production afin d'empêcher le déclenchement de l'OOM-Killer et de réduire le gonflement du RSS. Dans les conteneurs, je configure le maxmemory en dessous de la limite du cgroup et je prévois une marge pour les pics RDB/AOF, le tampon de réplication et la fragmentation. Cela permet d'éviter que le processus ne soit brutalement interrompu en raison de pics de courte durée, alors que l'éviction côté Redis pourrait encore être effective. Dans la surveillance, j'observe, outre used_memory également used_memory_rss et le rapport (mem_fragmentation_ratio), afin de réagir efficacement aux effets liés au système d'exploitation.
Défragmentation active et réserves de mémoire
Redis peut fragmenter sa mémoire en interne, ce qui réduit la RAM utilisable et déclenche des évictions plus tôt que prévu ; en activant la défragmentation, j'atténue ce comportement. Je prévois donc une marge au-delà de la consommation maximale attendue et je vérifie régulièrement la Fragmentation ainsi que l'utilisation effective. Des limites trop strictes font baisser le taux de réussite, tandis que des limites trop généreuses comportent le risque d'erreurs tardives si l'option « noeviction » est activée. Il convient de procéder par petites étapes lors de l'ajustement de maxmemory m'aident à maintenir les répercussions à un niveau mesurable et à ne pas les surcompenser à l'aveuglette. Ainsi, la planification du stockage reste réaliste et la Performance constante.
Avec activedefrag oui et des limites plus précises (cycle min/max) je lisse les pics de mémoire sans trop affecter le débit. Je préfère lancer la défragmentation en dehors des pics de charge, puis j'évalue si les évictions sont moins fréquentes ou mieux réparties.
Alléger de manière ciblée les « Big Keys » et les structures de données
Les clés d'une taille disproportionnée créent des trous dans le cache et déclenchent des évictions brutales. Je recherche ces valeurs aberrantes à l'aide de redis-cli --bigkeys ou UTILISATION DE LA MÉMOIRE par clé et par utilisation STATISTIQUES DE MÉMOIRE/MEMORY DOCTOR comme premier diagnostic. Solutions courantes : fractionner les gros blocs JSON, utiliser des hachages avec des encodages compacts (définir correctement les seuils Listpack/Ziplist), repenser la granularité des ensembles et des ensembles triés, et supprimer activement les anciens éléments. Pour les flux, je surveille à la fois le côté entrée et le côté consommateur : avec XTRIM Je limite la longueur et j'évite que les PEL (Pending Entries) ne s'accumulent à l'infini en traitant les consommateurs de manière fiable et rigoureuse ou en nettoyant les groupes inactifs.
Mesures concrètes d'optimisation pour le quotidien
Je commence par définir une politique claire en fonction de la charge de travail, je fixe des TTL réalistes et je surveille les taux de réussite et d'éviction tout au long de la journée. Ensuite, j'ajuste maxmemory à un rythme modéré et j'adapte maxmemory-samples afin d'obtenir de meilleures décisions LRU/LFU. Si le taux de réussite baisse malgré l'augmentation de la mémoire, le problème réside souvent dans des TTL trop courts, des objets trop volumineux ou une granularité de clé inadaptée ; dans ce cas, j'optimise la Clés et je réduis les données superflues. Sur WordPress, je vérifie la taille et le nombre d'objets dans le cache, ainsi que le comportement des plugins qui écrivent de manière trop intensive dans le cache. À chaque itération, le taux d'éviction diminue, les temps de réponse s'uniformisent et le cache prend en charge la Dernier fiable.
Guide pratique : Quand les expulsions dégénèrent
- Valider l'alerte : taux de réussite/d'échec, évictions, messages d'erreur (Commande OOM non autorisée), vérifier les latences.
- Mesure d'urgence : si possible, à titre temporaire
maxmemoryaugmenter légèrement pour gagner en stabilité ; sinon, limiter le trafic (limitation de débit/contre-pression). - Ajuster la politique : en cas de « Cache-only », passer si nécessaire à allkeys-lru Passer en mode « agressif » pour libérer de l'espace ; activer Lazyfree pour éviter les pics de latence.
- Nettoyage ciblé : les espaces de noms non essentiels via
SCAN+UNLINKsupprimer ; vérifier les TTL et augmenter les durées trop courtes si la recharge surcharge la source principale. - Identifier les gros consommateurs :
--bigkeys,UTILISATION DE LA MÉMOIRE, grands flux/ensembles triés ; marquer les raccourcis clavier pour le préchauffage. - Tenir compte de la persistance : une réécriture RDB/AOF est-elle en cours ? S'assurer d'une marge suffisante ou décaler la fenêtre.
- Post-stabilisation : réglage fin de
maxmemory-samples, paramètres LFU, défragmentation ; documenter l'effet d'apprentissage. - Prévention à long terme : mettre à jour la planification des capacités, mettre en place des instances distinctes pour les différentes politiques, affiner les alertes sur les indicateurs.
Aperçu final
Pour les caches « pures », j'opte généralement, dans la pratique, pour allkeys-lfu, pour découvrir les dernières actualités sur allkeys-lru, « volatile-policies » pour les données mixtes et « noeviction » pour les données sensibles. Il reste essentiel de définir des TTL clairs, de disposer de réserves de mémoire suffisantes et d’assurer une surveillance visible, afin que les évictions se déroulent de manière prévisible et sans surprise. Grâce à cette structure, j’évite les pertes de données, je maintiens un taux de réussite élevé et je réagis sereinement aux pics de charge. Le tableau ci-dessus aide à démarrer, puis les métriques permettent d’affiner les réglages. Ainsi, chaque environnement d’hébergement trouve une solution simple et robuste Stratégie pour la gestion de l'éviction dans Redis et assure un affichage rapide et constant des pages de.


