Redis Eviction bepaalt op hostingservers welke sleutels bij een tekort aan werkgeheugen worden verwijderd en welke in de cache blijven, zodat verzoeken betrouwbaar en snel worden verwerkt. Ik laat je concrete strategieën zien om het juiste beleid te kiezen, configureert en dit met monitoring waarborgt.
Centrale punten
Voordat ik op de details inga, zal ik de belangrijkste keuzes kort samenvatten, zodat je je Beleid snel kunt vaststellen. De volgende punten zijn bedoeld voor hostingbeheerders, DevOps-medewerkers en websitebeheerders die zich richten op prestaties. Ik houd rekening met typische workloads, variërend van pure cache tot gemengde datasets met TTL en permanente sleutels. Zo behoud je de juiste balans tussen cache-aandeel, gegevensbeveiliging en planbaarheid. Met deze uitgangspunten maak je een duidelijk Kies je server.
- Allkeys-LFU: Voor brede cache-workloads met zeer ongelijk verdeelde toegangsverzoeken.
- Allkeys-LRU: Voor actuele inhoud en goed voorspelbaar gedrag.
- Volatile-LRU/LFU: Verwijdert alleen TTL-sleutels, beschermt permanente gegevens.
- Noeviction: Voor kritieke gegevens; typefouten in plaats van verlies van sleutels.
- Controle: Houd het hitpercentage, het geheugen en de evictions voortdurend in de gaten.
Wat houdt Redis Eviction concreet in?
Onder Redis Eviction verstaat men het verwijderen van sleutels zodra de ingestelde maxmemory is bereikt en Redis ruimte moet vrijmaken zodat er nieuwe gegevens kunnen worden geschreven. Ik stel dit gedrag in via de instelling maxmemory-beleid, de opties zoals alle-sleutels-lru, allkeys-lfu, allkeys-random of de volatile-*-varianten biedt; elke optie geeft bij het verwijderen voorrang aan andere sleutels. LRU beschermt de laatst gebruikte sleutels, LFU geeft de voorkeur aan veelgebruikte gegevens, Random selecteert willekeurig via steekproeven, en volatile-beleidsregels houden alleen rekening met sleutels met een vervaltijd (TTL). Belangrijk: Redis neemt zijn verwijderingsbeslissingen op een performante manier via steekproeven, wat de latentie laag houdt en het systeem betrouwbaar maakt controleert. Pas wanneer het geheugen schaars wordt, treedt de eviction in werking; tot die tijd gedraagt Redis zich als een normale in-memory-gegevensopslag met Cache-voordelen.
Het kiezen van het juiste beleid voor hostingservers
Het beste beleid vloeit voort uit de vraag welke gegevens in het geheugen moeten blijven en welke het systeem opnieuw mag berekenen. Als Redis uitsluitend als cache dient, is een ‘allkeys’-strategie geschikt, omdat elk item in geval van twijfel opnieuw uit de oorspronkelijke bron wordt gegenereerd; dan scoort het allkeys-lfu bij ongelijke toegangsrechten en alle-sleutels-lru bij vrij recente inhoud. Als de instantie gemengde gegevens bevat, geef ik de voorkeur aan volatile-lru of volatile-lfu, zodat alleen TTL-sleutels vervallen en permanente gegevens onaangetast blijven. Als gegevens cruciaal zijn, kies ik voor noeviction, maar ik accepteer daarbij dat schrijfopdrachten mislukken wanneer het geheugen volledig bezet is en dat de toepassing hier correct op moet reageren. Deze eenvoudige beslissingslogica maakt de werking voorspelbaar, houdt het risico op fouten laag en geeft mij een duidelijk Leuning.
Praktijkgids: cache-only versus gemengde workloads
Voor pure cache-workloads streef ik naar een hoge hit-rate en accepteer ik dat verdringing nauwelijks een risico vormt, omdat gegevens snel vanuit de primaire bron opnieuw worden geladen. In dergelijke omgevingen levert allkeys-lfu vaak het beste compromis, aangezien veelgebruikte objecten lang in het geheugen blijven, terwijl minder belangrijke gegevens worden verwijderd. Wie de actualiteit vooropstelt, kiest voor alle-sleutels-lru, om de laatst gebruikte vermeldingen voorrang te geven en recente paginafragmenten in de cache te houden. Bij gemengde gegevensbestanden pas ik TTL toe op alle cache-sleutels en combineer ik dat met volatile-lru of volatile-lfu, zodat alleen duidelijk „tijdelijke“ gegevens worden verwijderd. Een goede opslaginstelling ondersteunt deze keuze; meer tips geef ik in mijn handleiding Het geheugen optimaal configureren, waarin concrete Maxmemory-reserves en statistieken worden belicht.
LRU versus LFU: wanneer is welke methode geschikt?
LRU (Least Recently Used) geeft prioriteit aan de tijdsduur sinds het laatste gebruik en zorgt ervoor dat recent opgevraagde inhoud behouden blijft. LFU (Least Frequently Used) telt de frequentie van de toegang en beschermt zo „blijvende favorieten“, zelfs als ze de afgelopen minuten niet zijn opgevraagd; bij sterk onregelmatige opvragingen levert dit merkbaar voordeel op. Als het gebruiksgedrag snel verandert, bijvoorbeeld bij nieuws of campagnes, heeft alle-sleutels-lru intuïtiever, omdat het de nadruk meer legt op de huidige activiteit. Bij stabiele, terugkerende patronen zoals menu’s, widgets op de startpagina of inloggegevens overtuigt het allkeys-lfu, omdat de inhoud continu beschikbaar blijft. Om verkeerde inschattingen te voorkomen, controleer ik regelmatig de hit-rate, de eviction-rate en de responstijden, want deze cijfers geven de werkelijke Gebruik betrouwbaar.
Fijnafstemming voor LRU/LFU
Om ervoor te zorgen dat de LRU/LFU nauwkeurig werken, stel ik drie stelschroeven af: maxmemory-samples, lfu-log-factor en lfu-verval-tijd. Hogere maxmemory-samples-Waarden (bijv. 10–15 in plaats van de standaardinstelling) verbeteren de steekproefkwaliteit bij evicties en verhogen zo het percentage „juiste“ sleutels, maar kosten wel CPU-vermogen. lfu-log-factor bepaalt hoe snel de LFU-teller stijgt: lage waarden reageren snel (goed voor kortstondige hypes), hoge waarden zorgen voor afvlakking (beter voor blijvende „heavy-hitters“). Met lfu-verval-tijd (in minuten) bepaal ik hoe snel oude populariteit „vervalt“; hogere waarden zijn geschikt voor dagelijkse patronen, lagere voor snel veranderende inhoud. Ik wijzig altijd slechts één parameter per iteratie, houd de hit-rate in de gaten en let op de latentie om niet onnodig CPU-vermogen te verspillen aan steekproeven.
TTL-strategieën met volatile-*
Op TTL gebaseerde beleidsregels zoals volatile-lru en volatile-lfu beperken verwijderingen tot sleutels met een vervaltijd en laten „permanente“ sleutels ongemoeid. Dit is geschikt voor opstellingen waarin Redis cachegegevens en langdurige gegevens bij elkaar houdt, bijvoorbeeld sessie-achtige informatie naast query-caches. Als ik consequent TTL’s instel voor alle cache-sleutels, kan ik ervoor zorgen dat verwijderingen alleen plaatsvinden waar ik dat wil. Belangrijk: als de database geen TTL-sleutels bevat, gedragen volatile-beleidsregels zich als noeviction, dus zonder verwijdering en met mogelijke schrijffouten bij een vol geheugen. Daarom controleer ik regelmatig of alle cache-objecten een redelijke levensduur hebben en of de tijdsintervallen tot de daadwerkelijke Actualiteit bij de inhoud passen.
Als aanvullende optie gebruik ik bij inhoud met een duidelijke looptijd volatile-ttl, waardoor sleutels met de kortste resterende geldigheidsduur als eerste worden verwijderd. Dat is handig als alle cache-objecten toch binnenkort worden vernieuwd en ik de „natuurlijke“ vervaldatum als prioriteit wil gebruiken. Voor tests of staging stel ik af en toe volatile-random om de CPU-belasting te minimaliseren; in de praktijk vermijd ik willekeurige varianten vanwege de slechtere voorspelbaarheid.
Noeviction voor kritieke gegevens
Op noeviction Redis verwijdert geen sleutels; leesbewerkingen blijven mogelijk, terwijl schrijfopdrachten kunnen mislukken zodra de geheugenlimiet is bereikt. Dit beschermt kritieke gegevens tegen onbedoelde verwijdering, maar vereist van de toepassing een robuuste omgang met foutmeldingen en eventueel backpressure. Ik gebruik noeviction op plaatsen waar cacheverlies duurder zou zijn dan tijdelijke schrijffouten, bijvoorbeeld bij beveiligingsrelevante instellingen of zeer gevoelige sessie-informatie. Belangrijk blijft een conservatieve geheugenplanning met reserve, zodat pieken niet onmiddellijk tot fouten leiden en de Toepassing blijft reageren. Daarnaast geef ik via monitoring actief een waarschuwing voordat de drempelwaarde wordt bereikt, zodat er tijdig tegen te gaan.
Persistentie, replicatie en opslagbuffer
Beslissingen over eviction moeten altijd worden genomen in de context van persistentie (RDB/AOF) en replicatie. RDB-snapshots en AOF-rewrites maken gebruik van copy-on-write; tijdens dit proces neemt het RSS-geheugen tijdelijk toe. Ik plan daarom een buffer van 25–50% boven de waargenomen piek in, zodat een herschrijving niet onbedoeld verdrijvingen veroorzaakt. De omvang hangt af van de schrijfsnelheid en de objectgrootte; hoe meer objecten tijdens de herschrijving veranderen, hoe groter de behoefte.
Bij replicatie houd ik rekening met de repl-backlog-size en de uitvoerbuffers voor replica’s. Bijzonder belangrijk: bij replica’s gebruik ik vaak replica-ignore-maxmemory yes (vroeger slave-ignore-maxmemory), zodat de replicatieserver bij piekbelastingen niet uit zichzelf wordt verwijderd terwijl hij de primaire server volgt. Voor leesreplica’s met cachefunctie kan ik daarentegen bewust een verwijderingsbeleid activeren als ik de opslagruimte strikt moet beperken. Voor kritieke gegevens koppel ik op replica’s graag noeviction met voldoende marge om afwijkingen in de gegevens te voorkomen.
Configuratie in redis.conf en tijdens de uitvoering
Ik werk op een reproduceerbare manier met duidelijke instellingen en sla deze permanent op:
# Voorbeeld: alleen cache, ongelijke toegang
maxmemory 4gb
maxmemory-policy allkeys-lfu
maxmemory-samples 10
lfu-log-factor 10
lfu-decay-time 1
# Optionele verwijderingen op de achtergrond (zie Lazyfree)
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
Tijdens de uitvoering test ik wijzigingen met CONFIG SET en schrijf ze op met CONFIG REWRITE permanent in het configuratiebestand. Voor gemengde workloads documenteer ik TTL-regels in de code en houd ik de Redis-instanties gescheiden op basis van hun doel (bijv. aparte cache versus sessies), zodat elke instantie een gerichte policy kan hanteren.
Lazyfree: Evictions zonder piek in de latentie
Grote sleutels of massale verwijderingen leiden snel en gelijktijdig tot pieken in de latentie. Met Lazyfree (lazyfree-lazy-eviction, lazyfree-lazy-expire, lazyfree-lazy-server-del) verplaats ik het vrijgeven van grote objecten naar achtergrondthreads; commando’s zoals UNLINK in plaats van DEL maken daar ook gebruik van. Resultaat: constantere responstijden bij dezelfde werklast. Ik houd daarbij het geheugen en de CPU in de gaten, want bewerkingen op de achtergrond kunnen op korte termijn extra overhead veroorzaken.
Monitoring en kengetallen: hit-ratio, opslagruimte, evictions
Een goed doordachte opstelling staat of valt met de zichtbaarheid: ik meet de Raakpercentage, het eviction-percentage, de latentie en het gebruikte geheugen in de loop van de tijd. Als het eviction-percentage stijgt terwijl het hit-percentage daalt, wijzen de cijfers op te weinig geheugen, verkeerde TTL’s of een ongeschikt beleid. Tijdens piekuren evalueer ik bovendien de foutpercentages van schrijfopdrachten om ‘noeviction’-risico’s direct te herkennen. De Redis-interne steekproeven voor LRU/LFU kunnen worden opgevraagd via maxmemory-samples aanpassen; hogere waarden leiden tot betere beslissingen, maar kosten wat CPU-vermogen. Ik verhoog deze waarde met mate, bekijk het effect op de responstijden en zoek zo de beste Instelling voor de werklast.
Voorbeeldconfiguraties voor hostingservers
Voor terugkerende hosting-scenario’s is een kleine matrix een beproefd hulpmiddel gebleken, die ik als uitgangspunt gebruik en vervolgens op basis van metingen verfijn. Ik houd altijd rekening met een reserve bij het maxmemory, zodat piekbelastingen worden opgevangen en evictions op een geordende manier plaatsvinden. Hiervoor kies ik het beleid op basis van de workload volgens de onderstaande tabel en documenteer ik de TTL-regels duidelijk in de applicatie. Deze werkwijze voorkomt misverstanden tussen Dev en Ops en zorgt voor reproduceerbaar gedrag in de dagelijkse praktijk. Met zo’n overzicht houd ik mijn Beslissingen transparant en kan ze later gemakkelijker aanpassen.
| Werkbelasting | Aanbevolen beleid | Voordeel | Risico | Tip |
|---|---|---|---|---|
| Pure cache, ongelijke toegangen | allkeys-lfu | Veelgebruikte objecten blijven behouden | Zeldzame sleutels vallen sneller | Hit-rate controleren, maxmemory-samples fijn afstellen |
| Alleen cache, actuele inhoud | alle-sleutels-lru | De laatst gebruikte sleutels blijven bewaard | Langdurige favorieten dalen eerder | Vaak geschikter voor nieuws/campagnes |
| Gemengde gegevens met TTL | volatile-lru/lfu | Permanente sleutels beveiligd | Zonder TTL geen verwijdering | TTL consequent toepassen en documenteren |
| Kritieke gegevensopslag | noeviction | Geen sleutelverlies | Spelfouten bij een vol RAM-geheugen | Zorgen voor foutafhandeling in de app |
| Test/Staging | allkeys-random | Zeer lage CPU-kosten | Onvoorspelbare uitzettingen | Niet gebruiken in productieve caches |
Gedeelde versus dedicated Redis bij hosting
In gedeelde omgevingen heb je vaker te maken met schommelende belastingprofielen en onduidelijke TTL-regels van andere projecten, waardoor evictions onvoorspelbaar kunnen lijken. Ik geef hier de voorkeur aan volatile-lru of volatile-lfu en stel korte, duidelijke TTL's in voor alle cache-sleutels, zodat alleen expliciet tijdelijke gegevens worden verwijderd. In speciale high-performance-caches zorgt allkeys-lfu vaak betere hit-percentages en stabielere responstijden, omdat „Heavy-Hitters“ betrouwbaar in het RAM-geheugen blijven. Wie nog twijfelt over deze afweging, kan mijn gids raadplegen over Gedeeld vs. speciaal, daar vergelijk ik de effecten op prestaties, isolatie en kosten. Met deze duidelijkheid verminder ik het risico op instortingen van de zijkanten en houd ik de Latency onder controle.
Redis hanteert niet standaard quota’s per klant. Als ik strikte opslaglimieten nodig heb, start ik aparte instanties of cluster-shards per project en definieer ik per instantie een eigen maxmemory samen met een passend beleid. Zo voorkom ik dat afzonderlijke tenants het gedeelde werkgeheugen domineren en onbedoeld evictions bij anderen veroorzaken.
WordPress en WooCommerce: de objectcache correct instellen
In WordPress-installaties komen query-resultaten, menu’s, inloggegevens en tijdelijke gegevens vaak terecht in de Redis-objectcache; deze sleutels lenen zich uitstekend voor op TTL gebaseerde regels. Bij dynamische pagina’s stel ik korte TTL’s in voor tijdelijke inhoud, zodat volatile-lfu of volatile-lru gericht ruimte creëren. Als de pagina veel terugkerende fragmenten bevat, overtuigt allkeys-lfu, omdat „duurlopers“ in het geheugen blijven staan en het cachepercentage hoog blijft. Typische fouten in de objectcache leg ik hier uit: Configuratiefout in de objectcache, daar ga ik in op TTL, naamruimten en sleutelgrootte. Met deze aanpassingen voorkom ik onnodige missers en houd ik de pagina stabiel tijdens piekbelastingen snel.
Praktische richtlijnen: Voor zeer vluchtige fragmenten (bijv. gepersonaliseerde widgets, winkelmandje-snippets) kies ik TTL’s in het bereik van seconden tot enkele minuten. Voor menustructuren, categorieën of widgets op de startpagina zijn langere TTL's zinvol, mits een cache-invalidator bij wijzigingen betrouwbaar wordt geactiveerd. WooCommerce-catalogi profiteren vaak van prewarm-taken (Cron), die top-productlijsten gericht vullen nadat de cache is geleegd. Zorg er bovendien voor dat plug-ins geen te grote objecten naar de objectcache schrijven; verdeel ze indien nodig in kleinere eenheden (meerdere kleinere sleutels in plaats van één gigantische blob) en stroomlijn de gegevensformaten.
Optimalisatie van besturingssystemen en containers
De standaardinstellingen van het besturingssysteem en de container beïnvloeden evictions indirect via de beschikbaarheid van geheugen en het RSS-gedrag. Ik stel vm.overcommit_memory=1, schakel Transparent Huge Pages (THP) uit en vermijd swap in productiecaches om de OOM-killer te voorkomen en RSS-bloat te verminderen. In containers configureer ik het maxmemory onder de cgroup-limiet en houd ruimte over voor RDB/AOF-pieken, replicatiebuffers en fragmentatie. Zo voorkom ik dat het proces abrupt wordt beëindigd vanwege korte pieken, ook al zou de Redis-eviction nog kunnen werken. Bij de monitoring houd ik naast gebruikt_geheugen ook gebruikt_geheugen_rss en de verhouding (mem_fragmentatie_ratio), om effectief te kunnen reageren op effecten van het besturingssysteem.
Actieve defragmentatie en geheugenreserves
Redis kan het geheugen intern fragmenteren, waardoor het bruikbare RAM-geheugen afneemt en er eerder dan verwacht gegevens worden verwijderd; met actieve defragmentatie verminder ik dit gedrag. Ik houd daarom rekening met een buffer boven het verwachte piekverbruik en controleer regelmatig de Versnippering en het daadwerkelijke gebruik. Te krappe limieten drukken het hit-percentage, te ruime limieten brengen het risico van vertraagde fouten met zich mee als noeviction actief is. Kleine stapjes bij het aanpassen van maxmemory helpen mij om de gevolgen meetbaar te houden en niet blindelings te overdrijven. Zo blijft de opslagplanning realistisch en de Prestaties constant.
Met activedefrag ja en fijnere grenzen (cyclus-min/max) zorg ik ervoor dat pieken in het geheugengebruik worden afgevlakt, zonder de doorvoer al te zeer te belasten. Ik voer de defragmentatie bij voorkeur buiten de piekuren uit en bekijk daarna of er minder vaak of op een meer geordende manier gegevens worden verwijderd.
Big Keys en gegevensstructuren doelgericht opschonen
Onevenredig grote keys veroorzaken gaten in de cache en leiden tot ingrijpende evictions. Ik zoek dergelijke uitschieters met redis-cli --bigkeys of GEHEUGENGEBRUIK per sleutel en gebruik GEHEUGENSTATISTIEKEN/MEMORY DOCTOR als eerste diagnose. Veelgebruikte maatregelen: grote JSON-blobs opsplitsen, hashes met compacte coderingen gebruiken (drempels voor Listpack/Ziplist correct instellen), bij sets/gesorteerde sets de granulariteit heroverwegen en oude elementen actief verwijderen. Voor streams houd ik zowel de invoer- als de verbruikerszijde in de gaten: met XTRIM Ik beperk de lengte en voorkom dat het aantal PEL's (Pending Entries) oneindig blijft toenemen door Consumer-taken nauwgezet af te werken of inactieve groepen op te ruimen.
Concrete tips voor het dagelijks leven
Ik begin met een duidelijk beleid op basis van de workload, stel realistische TTL’s in en houd de hit- en eviction-ratio gedurende de dag in de gaten. Daarna pas ik het beleid aan maxmemory in kleine stapjes en pas maxmemory-samples om betere LRU/LFU-beslissingen te nemen. Als de hit-rate ondanks een uitbreiding van het geheugen daalt, ligt het probleem vaak bij te korte TTL’s, te grote objecten of een verkeerde sleutelgranulariteit; in dat geval optimaliseer ik de Sleutels en verminder onnodige gegevens. Bij WordPress controleer ik de grootte en het aantal objecten in de cache, evenals het gedrag van plug-ins die te agressief naar de cache schrijven. Met elke iteratie daalt het eviction-percentage, worden de responstijden stabieler en draagt de cache bij aan de Belasting betrouwbaar.
Runbook: Wanneer uitzettingen uit de hand lopen
- Alarm valideren: hit-/miss-percentage, evictions, foutmeldingen (OOM-commando niet toegestaan), latenties controleren.
- Noodmaatregel: indien mogelijk tijdelijk
maxmemorylicht verhogen om meer stabiliteit te verkrijgen; of anders het verkeer afremmen (rate limit/backpressure). - Beleid aanpassen: bij ‘Cache-only’ indien nodig instellen op alle-sleutels-lru schakelen om meer ruimte vrij te maken; Lazyfree inschakelen om pieken in de latentie te voorkomen.
- Gericht opruimen: onbelangrijke naamruimten via
SCAN+UNLINKverwijderen; TTL's controleren en te korte looptijden verlengen als het opnieuw laden de primaire bron overbelast. - Grote verbruikers identificeren:
--bigkeys,GEHEUGENGEBRUIK, grote streams/gesorteerde sets; sneltoetsen voor Prewarm markeren. - Houd rekening met persistentie: is er een RDB/AOF-rewrite aan de gang? Zorg voor voldoende headroom of verschuif het venster.
- Nastabilisatie: fijnafstelling van
maxmemory-samples, LFU-parameters, defragmentatie; het leereffect vastleggen. - Duurzame preventie: de capaciteitsplanning bijwerken, afzonderlijke instanties voor verschillende beleidsregels invoeren, de waarschuwingen op basis van statistieken aanscherpen.
Afsluitend overzicht
Voor gewone caches kies ik in de praktijk meestal voor allkeys-lfu, voor nieuwe inhoud op alle-sleutels-lru, voor gemengde gegevens op ‘volatile-policies’ en voor gevoelige gegevens op ‘noeviction’. Duidelijke TTL’s, voldoende opslagruimte en zichtbare monitoring blijven cruciaal, zodat evicties voorspelbaar verlopen en er geen verrassingen zijn. Met deze structuur voorkom ik gegevensverlies, houd ik de hit-rate hoog en reageer ik rustig op piekbelastingen. De bovenstaande tabel helpt bij de start, daarna zorgen de statistieken voor de fijnafstemming. Zo vindt elke hostingomgeving een eenvoudige, robuuste Strategie voor Redis Eviction en levert pagina’s snel en consistent van.


