...

Redis LFU vs LRU: Vilken evictionspolicy är den rätta?

Redis LFU och LRU avgör vilka nycklar som ska tas bort från cachen när resurserna är knappa – och därmed avgör Träfffrekvens, svarstid och minnesanvändning. Jag visar dig när den frekvensbaserade policyn LFU eller den aktualitetsbaserade policyn LRU passar bäst, hur du konfigurerar dem och vilka effekter allkeys-lfu respektive allkeys-lru har i vardagen; nyckelordet Redis LFU står i centrum för detta.

Centrala punkter

  • Aktualitet mot. Frekvens: LRU prioriterar de senaste åtkomsthändelserna, LFU prioriterar de vanligaste åtkomsthändelserna.
  • Approximation I Redis: Båda policyerna använder stickprov via maxmemory-samples.
  • Arbetsbelastning Välj: Sessioner/instrumentpaneler → LRU, bästsäljare/rankningar → LFU.
  • Tuning Ställ in följande parametrar korrekt: lfu-decay-time, maxmemory, maxmemory-samples.
  • Övervakning Nödvändigt: Kontinuerligt övervaka träfffrekvens, utkastningar per sekund och latens.

Hur eviction fungerar i Redis

Redis lagrar data i RAM-minnet, om processen maxminne, måste den ersätta nycklar. Det är just här som policyer som allkeys-lru och allkeys-lfu kommer in i bilden, eftersom de avgör vilka poster som ska ge plats. Jag fokuserar på dessa två varianter eftersom de tar hänsyn till hela datauppsättningen, inte bara nycklar med TTL. Redis väljer vilken nyckel som ska raderas genom ett stickprov som du anger med maxmemory-samples styr; fler samplingspunkter ökar noggrannheten, men kräver mer CPU-kapacitet. Denna metod ger bra resultat i stora nyckelrum utan att administrationen blir för kostsam.

Internt: hur Redis implementerar LRU och LFU

Båda policyerna fungerar i Redis ungefär, för att bibehålla en konstant hastighet. LRU lagrar en tidsstämpel för den senaste åtkomsten för varje objekt. Vid uteslutning tar Redis ett stickprov och kasserar den „äldsta“ kandidaten i urvalet. I praktiken är detta extremt effektivt och tillräckligt noggrant om du väljer en stickprovsstorlek som är anpassad till nyckelutrymmet.

Redis LFU utökar denna idé med en kompakt frekvensmätare, som med tiden åldras (Decay). Varje åtkomst ökar användningsräknaren inte linjärt, utan dämpat, så att enskilda intensiva perioder inte permanent mättar räknaren. Samtidigt ser en tidsförfall till att tidigare popularitet så småningom tappar i betydelse. Genom parametrar som lfu-förfallstid (hur snabbt blir historiken föråldrad) och en intern logaritmisk faktor (hur mycket ökar räknarna vid varje åtkomst) balanserar du reaktionsglädje mot Stabilitet prioriteringen. Tumregel: Lägre decay-värden → snabbare anpassning, högre värden → långsammare men stabilare prioriteringar.

LRU i Redis: princip, fördelar, fallgropar

LRU tar bort den som har funnits längst outnyttjade Nycklar och prioriterar därmed aktualitet. Denna logik passar mönster med tidsmässig lokalitet, såsom sessioner, live-dashboards eller kortvariga API-svar. Redis använder en approximerad LRU: poster har en tidsstämpel, och slumpmässiga urval väljer den äldsta kandidaten – snabbt och spårbart. LRU reagerar snabbt på förändringar, eftersom nyanvända nycklar förblir högst upp och äldre försvinner. Stora engångsskanningar kan dock bli problematiska, eftersom de fyller cachen med kortlivade värden och viktiga nycklar som tillfälligt är inaktiva förtränga.

Praktiskt tips: Om du använder LRU och regelbundet kör „kalla“ massfrågor (t.ex. backoffice-rapporter), bör du kapsla in dessa arbetsbelastningar i separat Cacher eller planera mer generöst maxminne-reserver. På så sätt undviker du ”cache-pollution”, där värdefulla data som snart kommer att behövas igen trängs undan.

LFU i Redis: Princip, fördelar, fallgropar

LFU tar bort nycklar med låg Användningsfrekvens och skyddar därmed långvariga „hot keys“. Den interna räknaren växer logaritmiskt och avtar med tiden (decay), så att gammal popularitet inte räknas för evigt. Detta leder till en utjämnande viktning: Ofta använda data bevaras längre, medan enstaka avvikelser knappt påverkar prioriteringen. LFU ger ofta en högre träfffrekvens i kataloger, rankningar eller feature-cacher, eftersom den behåller beprövade nycklar i minnet. Den reagerar dock långsammare på nya trender, varför finjusteringen av lfu-förfallstid förblir viktigt.

För Trender inom ”på/av” (t.ex. marknadsföringskampanjer) gäller följande: Ställ in avklingningen så att en ny trend får en märkbar inverkan utan att tillfälliga störningar ständigt omorganiserar cachen. I många projekt har följande visat sig fungera bra: en försiktig start, följt av en gradvis ökning tills träfffrekvensen förblir stabil under belastning.

Jämförelse: Recency kontra Frequency i vardagen

I grund och botten skiljer LRU („när den senast användes“) och LFU („hur ofta den används“) åt – jag väljer utifrån den faktiska Arbetsbelastning. För flyktiga, användarnära data fungerar LRU oftast bättre, eftersom nya åtkomsthändelser ofta föregriper framtida åtkomsthändelser. För populära produktdata eller konfigurationer fungerar LFU bättre, eftersom varaktig popularitet är avgörande. I blandade scenarier delar jag upp cachen efter datatyper och tillämpar olika policyer. Följande tabell sammanfattar kortfattat skillnaderna och ger dig en snabb Beslutsstöd.

Aspekt LRU (allkeys-lru) LFU (allkeys-lfu)
Prioritet Aktualitet antalet besök Frekvens antalet besök
Reaktion på mönsterbyte Skynda dig, eftersom det är den senaste användningen som räknas Måttligt, eftersom historien spelar in
Rekommenderade arbetsbelastningar Sessioner, instrumentpaneler, live-API:er Bästsäljare, rankningar, specialcacher
Känslighet för „föroreningar“ Ganska hög vid stora skanningar Ganska låg tack vare frekvensräknaren
Tuning-skruvar maxmemory-samples lfu-förfallstid, maxmemory-samples
Förklarbarhet Mycket intuitiv Bra, med tanke på Decay

Effekter på prestandan i praktiken

När det gäller små datamängder är skillnaden ofta låg; ju större datamängden blir, desto tydligare blir skillnaden. LRU övertygar genom låga CPU-kostnader för approximeringen och en tydlig orsak: en nyckel tas bort eftersom den senast var oanvänd. LFU utmärker sig vid konsekventa åtkomsthändelser, eftersom ”hot keys” säkert förblir i RAM-minnet och träfffrekvensen ökar märkbart. Priset är den förståelse som krävs för räknare och decay, så att du varken reagerar för trögt eller för aggressivt. Jag kontrollerar effekterna med profilering och mätvärden, istället för att bara gå på känsla besluta.

Planera dessutom för Kallstart Efter omstart eller driftsättning är cachen tom eller „ovetande“ om förekomsterna. LRU stabiliseras snabbt genom kortsiktig lokalitet. LFU behöver naturligtvis en viss uppvärmningstid för att identifiera verkliga hot keys. Strategier som Förvärmning (att proaktivt ladda viktiga nycklar) eller en stegvis trafikökning kan bidra till att dämpa den inledande latensen och antalet missar.

Konfiguration och inställningar: de viktigaste alternativen

Jag väljer policyn via maxmemory-policy, vanligtvis allkeys-lru eller allkeys-lfu, mer sällan volatile-varianter med fokus på TTL. Med maxminne Jag fastställer den strikta gränsen från vilken Eviction startar och dimensionerar den utifrån datamängden plus en säkerhetsmarginal. Storleken på urvalet styr jag via maxmemory-samples; högre värden förbättrar urvalet, men kräver CPU-resurser. För LFU gäller lfu-förfallstid avgörande, eftersom den bestämmer hur snabbt gamla åtkomsthändelser avtar i betydelse och nya får större vikt. En utförlig guide till dimensionering av lagringsutrymmet hittar du här: Konfigurera lagringsutrymmet på bästa sätt.

Konkreta tips för praktiken

För att komma igång snabbt arbetar jag med tydliga standardinställningar och itererar under belastning:

  • allkeys-lru + maxmemory-samples 7–10 för flyktiga, användarnära data
  • Redis LFU (allkeys-lfu) + lfu-decay-time konservativt (t.ex. ett måttligt värde) för stabila snabbkommandobelastningar

Ställa in konfigurationen under körning:

CONFIG SET maxmemory 8gb
CONFIG SET maxmemory-policy allkeys-lru
CONFIG SET maxmemory-samples 10
# Byte till LFU:
CONFIG SET maxmemory-policy allkeys-lfu
CONFIG SET lfu-decay-time 5

I redis.conf definierar du samma inställningar permanent. Jag testar först ändringarna i stagingmiljön med en representativ belastning innan jag implementerar dem i produktionsmiljön.

Välj urvalsstorlek

maxmemory-samples är en pålitlig inställningsparameter: Högre värden förbättrar träffkvaliteten för eviction-kandidaterna, men kräver mer CPU-resurser. Som tumregel börjar jag med 7–10 vid stora nyckelutrymmen och sänker värdet endast om CPU-tiden börjar ta slut. Vid små nyckelutrymmen räcker det ofta med 5 prover.

Övervakning och nyckeltal: mäta istället för att gissa

Jag observerar kontinuerligt Träfffrekvens, evictions, latenser och minnesanvändning för att bedöma samspelet. Om antalet evictions ökar kraftigt kontrollerar jag RAM-reserver, TTL-strategier och den valda policyn. En sjunkande träfffrekvens visar ofta att förändrade mönster försvagar den aktuella policyn eller att dataposter inte cachas tillräckligt separat. Latensspikar tyder ibland på att Exempel eller till en alltför aggressiv eviction. Regelbundna belastningstester hjälper mig att hitta rätt balans mellan CPU-belastning, minnesgräns och träfffrekvens.

Praktiska kommandon för snabba kontroller:

INFO stats     # keyspace_hits, keyspace_misses, evicted_keys, expired_keys
INFO memory    # used_memory, fragmentation, allocator_overhead
LATENCY DOCTOR # Information om toppar, t.ex. förgrening eller I/O

Die Träfffrekvens Jag beräknar det som träffar / (träffar + missar). En sjunkande andel samtidigt som antalet utkastningar ökar är en varningssignal. avhysda_nycklar i förhållande till trafiken och använt_minne visar om policyn ofta måste aktiveras. Med Nyckel: MINNESANVÄNDNING identifierar du objekt som är för stora och som tar oproportionerligt mycket plats i din cache.

Aspekter rörande webbhotell och skalbarhet: Välj plattform med omsorg

Redis visar sina styrkor på en högpresterande Plattform med gott om RAM, låg latens och pålitlig nätverksanslutning. När projekten växer undviker jag kontinuerlig drift under full belastning, eftersom det då leder till alltför frekventa utkastningar och träfffrekvensen försämras. En bra Strategi för hosting ser till att policyerna träder i kraft vid behov och inte kör på hela tiden. När jag jämför satsar jag på premiumleverantörer som webhoster.de, vars infrastruktur hanterar höga belastningar smidigt och möjliggör planerbar kapacitet. På så sätt bidrar plattformen direkt till färre avstängningar och bättre Svarstider och en mer stabil prestanda.

Aspekter rörande kluster och repliker

I sharding-konfigurationer (t.ex. Redis Cluster) tillämpas eviction-beslut per nod. Det innebär att headroom, policy och inställningar måste stämma för varje nod, inte bara „i genomsnitt“. Hot keys som är ojämnt fördelade över slottarna kan få enskilda noder att nå sin gräns tidigare. Planera därför buffertar per shard och övervaka evictions på nodnivå. Replikat överför dataläget inklusive raderade nycklar; tänk på vid belastningstester att ytterligare replikering kan öka latensen utan att policyn i sig är orsaken.

TTL-strategier och kombinerade riktlinjer

Med TTL skyddar jag hållbara Konfigurationer och prioriterar tidskänsliga, kortlivade data. Om jag använder volatile-lru eller volatile-lfu ersätter Redis endast nycklar med utgångstid – vilket är användbart när cache och permanenta värden samexisterar. Jag delar ofta upp cacher efter datatyper: sessioner på LRU, produktkataloger på LFU, för att dra nytta av respektive metods styrkor. Ett klokt val av TTL förhindrar att föråldrade poster i onödan tar upp RAM-minne och orsakar utplaceringar. På så sätt håller jag minnet rent utan att förlora användbara Snabbtangenter ...att förlora.

Viktigt: En policy gäller per instans. Du kan på ett tillförlitligt sätt tillämpa olika policyer för olika datatyper genom att använda separata Redis-instanser eller tydligt avgränsade cacher. Namnrymder i sig ändrar inte policyn, men de underlättar målinriktad ogiltigförklaring och mätning.

Praktisk genomgång: Börja med LRU, övergå sedan målmedvetet till LFU

Jag brukar ofta börja med LRU, eftersom det är intuitivt och ger snabba resultat. Därefter identifierar jag cacher med beständiga hotkeys och byter selektivt till LFU. Den här metoden minimerar risken, eftersom du bara gör ändringar där datamönstren verkligen gynnar frekvenslogiken. Med hjälp av kanarieförsök och A/B-tester mäter jag träfffrekvensen och latensen före och efter omställningen. På så sätt optimerar jag steg för steg, istället för att ändra hela Plattform att byta om på ett ögonblick.

En beprövad migrationsväg

  • Fastställa utgångsvärden: registrera aktuell träfffrekvens, uteslutningar, 95:e och 99:e percentilen för latensen.
  • Välj pilotcache: ett stabilt område med mycket läsning och tydliga snabbtangenter.
  • Aktivera LFU, lfu-förfallstid ställa in på konservativt läge, maxmemory-samples öka.
  • Planera in en uppvärmningsfas och håll uppsikt tills värdena har stabiliserats.
  • Jämför nyckeltalen och gör sedan justeringar i små steg.

Vanliga fallgropar i appar (t.ex. WordPress)

I innehållssystem kan felaktiga TTL-värden och olämpliga Nycklar vilket snabbt kan leda till en flod av evictions. Kontrollera om dynamiska sidor oavsiktligt cachelagras eller om för stora värden överbelastar minnet. Se till att ogiltigförklaringen fungerar korrekt efter publiceringar, så att föråldrat innehåll försvinner och utrymme frigörs. Denna guide hjälper dig att identifiera typiska fel i CMS-miljön: Fel i objektcachen. Om du gör en korrekt invalidering, anger realistiska TTL-värden och väljer rätt policy, ökar träfffrekvensen och Hastighet mätbar.

Ytterligare anti-mönster från praktiken:

  • Stora enskilda objekt (t.ex. enorma JSON-blobbar) tränger undan många små, användbara nycklar. Lösning: Dela upp data och cacha endast de segment som faktiskt används.
  • Åskande spis: Många samtidiga missar för samma nyckel. Lösning: Request-Coalescing/lås, korta jittervärden för TTL:er, så att förnyelserna sker fördelat över tiden.
  • Skanningsföroreningar: Batch-läsningar utan återanvändning. Lösning: Separat instans/namnrymd, LRU där med mer generöst tilldelat minne eller att medvetet inte cacha arbetsbelastningarna.
  • Otydlig ogiltigförklaring: Gamla versioner fyller cachen. Lösning: Tydliga nyckelscheman (t.ex. versionsprefix) och deterministiska ogiltigförklaringsvägar.

Sammanfattning: Hur jag gör valet

Jag ställer in LRU när aktualitet är den bästa heuristiken för framtida åtkomst – till exempel vid sessioner, instrumentpaneler och live-API:er. Jag använder LFU, om det finns tydliga, beständiga snabbkommandon som jag vill skydda även vid belastningstoppar. Övervakningen visar mig om utplaceringarna blir för många eller om träfffrekvensen sjunker; då justerar jag samplar, TTL:er och decay. Genom ett väl genomtänkt val av plattform, smarta lagringsgränser och separata cacher per datatyp får jag ständigt ut mer. På så sätt förblir cachen snabb, förutsägbar och anpassad till åtkomstmönstret – helt utan gissningar.

Aktuella artiklar

Visualisering av en Redis-cache med servrar och dataströmmar för att illustrera LFU- och LRU-eviktionsprinciper
Databaser

Redis LFU vs LRU: Vilken evictionspolicy är den rätta?

För att konfigurera din cache på bästa sätt bör du förstå hur Redis-eviction fungerar med Redis LFU och Redis LRU – den här artikeln ger dig en direkt jämförelse och hjälper dig att välja rätt policy.