Mönster för cache-invalidering
Utforska olika strategier för att ogiltigförklara cachad data och säkerställa aktualitet och konsistens.
Mönster för cache-invalidering är en gratis lektion i Grunderna i systemdesign för backendutvecklare på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Grunderna i systemdesign för backendutvecklare, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Grunderna i systemdesign för backendutvecklare innehåller totalt 4 lektioner.
Vad är cacheinvalidisering?
Cachning gör applikationer snabbare genom att lagra data som används ofta närmare den plats där den behövs. Men vad händer när originaldatan ändras?
Cacheinvalidisering är processen att ta bort eller uppdatera cachad data när källdatan har ändrats. Det säkerställer att användarna alltid ser den mest aktuella informationen.
Problemet med inaktuell data
Föreställ dig att du visar priset på en produkt på en e-handelssajt. Om priset ändras i databasen men webbläsaren (eller en mellanliggande cache) fortfarande visar det gamla priset är det inaktuell data.
Inaktuell data kan leda till felaktig information, dåliga användarupplevelser eller till och med ekonomiska förluster. Effektiv invalidisering är avgörande för att förhindra detta.
Tidsbaserad invalidisering (TTL)
Den enklaste strategin för invalidisering är Time-To-Live (TTL). Varje cachat objekt tilldelas en utgångstid. Efter denna tid betraktas objektet som inaktuellt och tas bort eller uppdateras vid nästa begäran.
Det är enkelt att implementera, men garanterar inte omedelbar aktualitet om datan ändras *innan* TTL löper ut.
// Example: Setting a cache entry with a TTL
cache.put("user:123", userData, 300); // Cache for 300 seconds
// When requesting "user:123" after 300 seconds,
// the cache will return null or a stale indicator.TTL: enkelt men begränsat
Fördelar med TTL:
- Enkelt att implementera och hantera.
- Tar automatiskt bort gamla data.
- Minskar belastningen på databasen med jämna mellanrum.
Nackdelar med TTL:
- Data kan vara inaktuell under hela TTL-perioden.
- Det kan vara svårt att välja en optimal TTL.
- Passar inte för data som kräver omedelbar konsekvens.
Explicit invalidisering: på begäran
Explicit invalidisering innebär att ett cachat objekt tas bort direkt när motsvarande källdata ändras. Det säkerställer omedelbar aktualitet.
När en uppdatering sker i databasen säger applikationen uttryckligen åt cachen att ta bort det eller de berörda objekten. Nästa läsbegäran hämtar då färska data från databasen och fyller på cachen igen.
// When an item is updated in the database
function updateProduct(productId, newPrice) {
database.update("products", productId, newPrice);
cache.delete("product:" + productId); // Explicitly remove from cache
}Cache-Aside och explicit invalidisering
Detta mönster kombinerar strategin Cache-Aside (där applikationen hanterar cachningen) med explicit invalidisering. Det är mycket vanligt.
Så fungerar det:
- Läsning: Kontrollera cachen först. Om objektet inte hittas hämtar du det från databasen och lagrar det sedan i cachen.
- Skrivning: Uppdatera databasen först och invalidisera (ta bort) sedan uttryckligen objektet från cachen.
// Read operation
function getProduct(productId) {
let product = cache.get("product:" + productId);
if (product === null) {
product = database.fetch("products", productId);
cache.put("product:" + productId, product);
}
return product;
}
// Write operation (as seen in previous scene)
// updateProduct(productId, newPrice) {...}Händelsestyrd invalidisering (Pub/Sub)
I distribuerade system använder händelsestyrd invalidisering en Publish/Subscribe-modell (Pub/Sub). När data ändras publicerar den ansvariga tjänsten en "update"-händelse till en händelsebuss.
Andra tjänster eller cacheinstanser som har en kopia av datan prenumererar på dessa händelser och invalidiserar sina lokala cachar i enlighet med detta. Det frikopplar tjänsterna och säkerställer konsekvens mellan många komponenter.
Versionshantering för aktuell cache
Ett annat sätt är att använda versionsnummer eller tidsstämplar. Varje cachat objekt och motsvarande datapost i databasen kan ha en version.
När du hämtar data kan du jämföra versionen av det cachade objektet med databasens version. Om den cachade versionen är äldre är den inaktuell och behöver uppdateras. Detta är även användbart för optimistisk samtidighetskontroll.
// Conceptual check for data freshness
function isCacheStale(cachedItem, dbItem) {
return cachedItem.version < dbItem.version;
}
// Or using a timestamp
function isCacheStale(cachedItem, dbItem) {
return cachedItem.lastModified < dbItem.lastModified;
}Välja rätt invalidisering
Det bästa invalidiseringsmönstret beror på applikationens behov:
- Dataaktualitet: Hur viktigt är det att användarna ser de allra senaste uppgifterna?
- Uppdateringsfrekvens: Hur ofta ändras datan?
- Systemkomplexitet: Hur många tjänster delar datan?
- Prestandapåverkan: Vad kostar invalidiseringen jämfört med kostnaden för inaktuell data?
Ofta används en kombination av mönster.
Utmaning: invalidisering
Du utformar ett system för en aktiehandelsplattform i realtid. Aktiekurserna uppdateras mycket ofta, och om användarna visas inaktuella kurser kan det leda till betydande ekonomiska problem.
Vilken strategi för cache-invalidering är mest lämplig för att säkerställa att användarna alltid ser de senaste aktiekurserna?
Repetition av cache-invalidering
I den här lektionen har vi gått igenom viktiga mönster för cache-invalidering:
- Time-To-Live (TTL): Enkel, tidsbaserad utgång.
- Explicit invalidering: Direkt borttagning när data ändras.
- Händelsestyrning (Pub/Sub): För distribuerade system som ska meddela om ändringar.
- Versionshantering: Jämförelse av dataversioner eller tidsstämplar för att kontrollera aktualitet.
Genom att välja rätt strategi säkerställer du datakonsistens och en tillförlitlig användarupplevelse i dina system.
Lär dig Grunderna i systemdesign för backendutvecklare med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 12
- Lektioner
- 48
Vanliga frågor
Är lektionen ”Mönster för cache-invalidering” gratis?
Ja – hela texten till ”Mönster för cache-invalidering” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Grunderna i systemdesign för backendutvecklare, kan Ni uppgradera till CoddyKit PRO. Kursen i Grunderna i systemdesign för backendutvecklare innehåller totalt 4 lektioner.
Vad lär jag mig i ”Mönster för cache-invalidering”?
Utforska olika strategier för att ogiltigförklara cachad data och säkerställa aktualitet och konsistens. Ni övar på Grunderna i systemdesign för backendutvecklare med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Grunderna i systemdesign för backendutvecklare?
Du behöver inga förkunskaper. Utbildningen i Grunderna i systemdesign för backendutvecklare på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Mönster för cache-invalidering”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Grunderna i systemdesign för backendutvecklare-lektionen?
Ja. Varje Grunderna i systemdesign för backendutvecklare-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Mönster för cache-invalidering
- CDN-integrering och edge-cachning
- Distribuerad cachning med Redis
- Strategier för cache-eviction