Bufringsstrategier: Lazy Loading og Write-Through
Implementer lazy loading for å fylle bufferen ved cache-miss, og write-through for å holde bufferen konsistent med hver databaseskriving
Bufringsstrategier: Lazy Loading og Write-Through er en gratis leksjon i Cloud & IT Cert Prep på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Cloud & IT Cert Prep, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Cloud & IT Cert Prep inneholder totalt 4 leksjoner.
Hvorfor hurtigbufferstrategier er viktige
Når De setter inn en hurtigbuffer mellom applikasjonen og databasen, trenger De en hurtigbufferstrategi – et sett med regler som avgjør når data legges i hurtigbufferen, når de leses fra den, og når de fjernes. Feil strategi kan føre til enten foreldede data (hurtigbufferen returnerer utdaterte verdier), kalde cache-misser (hurtigbufferen er tom, og hver forespørsel går til databasen) eller cache stampede (mange samtidige forespørsler etter den samme manglende nøkkelen treffer databasen samtidig). De to grunnleggende strategiene er lazy loading og write-through.
Lazy loading (cache-aside): Slik fungerer det
Lazy loading (også kalt cache-aside) er det vanligste hurtigbuffermønsteret. Applikasjonen sjekker hurtigbufferen først. Ved en cache hit returneres dataene direkte fra hurtigbufferen – den raske banen. Ved en cache miss henter applikasjonen data fra databasen, skriver resultatet til hurtigbufferen med en TTL og returnerer det til den som foretok forespørselen. Hurtigbufferen fylles bare med data som faktisk etterspørres – derav «lazy». Den neste forespørselen etter samme nøkkel finner dataene i hurtigbufferen.
# Lazy loading pattern (Python with redis-py)
def get_user(user_id, redis_client, db):
cache_key = f'user:{user_id}'
# 1. Check cache
cached = redis_client.get(cache_key)
if cached:
return json.loads(cached) # Cache HIT
# 2. Cache MISS: fetch from DB
user = db.query('SELECT * FROM users WHERE id = %s', user_id)
# 3. Populate cache with TTL of 300 seconds
redis_client.setex(cache_key, 300, json.dumps(user))
return userLazy loading: Fordeler
Lazy loading har tre viktige fordeler: bare etterspurte data hurtigbufres – hurtigbufferen fylles ikke med data ingen leser, slik at minnet utnyttes effektivt. En kald hurtigbuffer stopper ikke applikasjonen – ved cache-misser faller applikasjonen tilbake til databasen, slik at den fortsetter å fungere selv om ElastiCache startes på nytt eller en node svikter (med høyere ventetid). Hurtigbufferen er alltid eventual consistent med databasen, fordi foreldede data utløper via TTL selv om oppdateringer ikke ble fanget opp.
Lazy loading: Ulemper
Lazy loading har tre viktige ulemper: cache-misser er kostbare – tre operasjoner (sjekk av hurtigbuffer, lesing fra databasen og skriving til hurtigbufferen) sammenlignet med én ved en cache hit, noe som gir høyere ventetid for kalde forespørsler. Foreldede data – etter en databaseoppdatering leverer hurtigbufferen fortsatt den gamle verdien til TTL-en utløper eller nøkkelen ugyldiggjøres eksplisitt (et vindu med inkonsistens i hurtigbufferen). Cache stampede – hvis en populær nøkkel utløper, får mange samtidige forespørsler et cache-miss og treffer databasen samtidig, noe som potensielt kan overbelaste den.
# Mitigating cache stampede with a probabilistic early expiration
# (Refresh the key before it expires to avoid simultaneous misses)
def get_with_stampede_protection(key, redis_client, db_fetch_fn, ttl=300):
value = redis_client.get(key)
ttl_remaining = redis_client.ttl(key)
# Probabilistically refresh before expiry
if value is None or (ttl_remaining < 30 and random.random() < 0.1):
value = db_fetch_fn()
redis_client.setex(key, ttl, json.dumps(value))
return json.loads(value)Write-through: Slik fungerer det
I strategien write-through skrives alle databaseoppdateringer også til hurtigbufferen samtidig. Applikasjonen skriver til både hurtigbufferen og databasen som del av samme operasjon (eller databasen utløser en oppdatering av hurtigbufferen). Hurtigbufferen er derfor alltid synkronisert med databasen – det finnes ikke noe vindu med foreldede data. Write-through garanterer at dataene i hurtigbufferen alltid er oppdaterte, slik at etterfølgende leseoperasjoner alltid blir cache hits for nylig skrevne data.
# Write-through pattern (Python)
def update_user(user_id, user_data, redis_client, db):
# 1. Write to database FIRST
db.execute('UPDATE users SET name=%s WHERE id=%s',
(user_data['name'], user_id))
# 2. Update cache immediately (write-through)
cache_key = f'user:{user_id}'
redis_client.setex(cache_key, 3600, json.dumps(user_data))
return user_data
# Every read is now a cache hit for recently updated dataWrite-through: Fordeler
Fordelene med write-through er: dataene i hurtigbufferen er alltid ferske – ingen foreldede data fordi hurtigbufferen oppdateres ved hver skriveoperasjon. Leseoperasjoner er alltid raske – populære data som skrives ofte, ligger alltid i hurtigbufferen. Ingen cache stampede ved lesing – fordi dataene forhåndsutfylles før de leses, oppstår det ingen kalde cache-misser for nylig skrevne data. Denne strategien egner seg godt for arbeidsbelastninger med mange leseoperasjoner og hyppige oppdateringer der ferske data er avgjørende, for eksempel produktkataloger, prissystemer eller hurtigbuffere for brukerprofiler.
Write-through: Ulemper
Ulempene med write-through er: skrivekostnad – hver skriveoperasjon medfører to operasjoner (database + hurtigbuffer), noe som øker ventetiden for skriveoperasjoner. Forurensning av hurtigbufferen – data hurtigbufres selv om de aldri leses igjen (skrevet én gang, aldri etterspurt), noe som sløser med hurtigbufferminne. Omstart av hurtigbufferen gir en kald hurtigbuffer – hvis hurtigbufferklyngen startes på nytt, går alle data som ble skrevet proaktivt tapt, og hurtigbufferen må fylles på nytt gjennom skriveoperasjoner eller en oppvarmingsprosess. Kombiner write-through med en TTL for å hindre ubegrenset vekst av sjelden leste data i hurtigbufferen.
Kombinere lazy loading og write-through
I praksis kombinerer mange produksjonssystemer begge strategiene: bruk write-through for data som oppdateres og leses ofte (for eksempel brukerøkter eller gjeldende priser), og lazy loading for data som oppdateres sjelden, men leses ofte (for eksempel produktbeskrivelser eller artikkelinnhold). Angi passende TTL-er for begge: write-through-nøkler får en lang TTL siden dataene alltid er ferske, mens lazy-loaded-nøkler får en kortere TTL for å begrense vinduet med foreldede data. Denne hybride tilnærmingen maksimerer cache hit-raten samtidig som foreldelse minimeres.
# Hybrid: write-through for sessions, lazy loading for product data
# Write-through for session data (always fresh, critical)
def save_session(session_id, data, redis_client, db):
db.upsert('sessions', session_id, data)
redis_client.setex(f'session:{session_id}', 3600, json.dumps(data))
# Lazy loading for product catalog (infrequent updates OK)
def get_product(product_id, redis_client, db):
cached = redis_client.get(f'product:{product_id}')
if cached:
return json.loads(cached)
product = db.query('SELECT * FROM products WHERE id=%s', product_id)
redis_client.setex(f'product:{product_id}', 86400, json.dumps(product))
return productPrinsipper for utforming av TTL
Time-To-Live (TTL) for hurtigbufrede data styrer det maksimale vinduet med foreldede data og hurtigbufferens minneavtrykk. Utform TTL-er basert på: hvor ofte dataene oppdateres (øktdata endres ofte → kort TTL; statisk innhold endres sjelden → lang TTL), toleranse for foreldelse (finansielle priser → svært kort; blogginnlegg → timer eller dager) og tilgjengelig hurtigbufferminne (lite minne → kortere TTL for å fjerne foreldede data raskere). Angi alltid en TTL – hurtigbufre aldri data uten utløp, ellers vil hurtigbufferen til slutt fylles med foreldede data.
# TTL examples by data type
# API rate limit counter: 60 seconds
redis_client.setex(f'ratelimit:{ip}', 60, count)
# User session: 30 minutes
redis_client.setex(f'session:{id}', 1800, json.dumps(session))
# Product catalog: 24 hours
redis_client.setex(f'product:{id}', 86400, json.dumps(product))
# Stock price: 10 seconds
redis_client.setex(f'price:{symbol}', 10, price)
# Static site content: 7 days
redis_client.setex(f'page:{slug}', 604800, html_content)Ugyldiggjøring av hurtigbuffer ved oppdatering
I stedet for å bare stole på at TTL-en utløper, kan De ugyldiggjøre (slette) hurtigbuffernøkler eksplisitt når de underliggende dataene endres. Dette fjerner vinduet med foreldede data fullstendig. Vanlige mønstre er: delete-on-write (slett hurtigbuffernøkkelen etter hver databaseoppdatering – neste leseoperasjon fyller den på igjen via lazy loading) og hendelsesdrevet ugyldiggjøring (DynamoDB Streams eller endringsfangst i RDS utløser en Lambda-funksjon som sletter berørte nøkler). Ugyldiggjøring av hurtigbufferen er et av de vanskeligste problemene i distribuerte systemer. Jo enklere logikken for ugyldiggjøring er, desto mer pålitelig blir hurtigbufferen.
# Delete-on-write invalidation pattern
def update_product(product_id, new_data, redis_client, db):
# Update the database
db.execute('UPDATE products SET ... WHERE id=%s', (product_id,))
# Invalidate the cache key
redis_client.delete(f'product:{product_id}')
# Also invalidate any list/search caches that may include this product
redis_client.delete('products:list:page:1')
redis_client.delete(f'products:category:{new_data["category_id"]}')
# Next read will trigger lazy loading with fresh dataWrite-behind (write-back-hurtigbufring)
Et mindre vanlig, men kraftig mønster er write-behind (write-back): Applikasjonen skriver bare til hurtigbufferen, og hurtigbufferen tømmer asynkront data til databasen i bakgrunnen. Dette gir svært raske skriveoperasjoner (bare i minnet), men med risiko for datatap hvis hurtigbufferen svikter før dataene er skrevet til databasen. Write-behind egner seg for skriveoperasjoner med høy frekvens og stort volum, der dataene kan rekonstrueres eller mindre tap er akseptable – for eksempel treffellere, analysehendelser eller oppdateringer av spillpoeng. ElastiCache støtter ikke write-behind innebygd; det må implementeres i applikasjonslaget.
# Write-behind pattern: write to cache, flush to DB asynchronously
# Application writes:
# redis_client.incr('post:42:views') # fast, in-memory only
# Background job (runs every 60 seconds):
def flush_view_counts(redis_client, db):
for key in redis_client.scan_iter('post:*:views'):
count = redis_client.getdel(key) # atomic get-and-delete
post_id = key.split(':')[1]
db.execute('UPDATE posts SET views = views + %s WHERE id = %s',
(int(count), post_id))Kort kontroll
Test forståelsen Deres av AWS Solutions Architect-konsepter (SAA-C03) fra denne leksjonen.
Oppsummering av leksjonen
I denne leksjonen lærte De at lazy loading fyller hurtigbufferen ved leseoperasjoner som gir cache-miss og utnytter minnet effektivt, men kan levere foreldede data til TTL-en utløper, at write-through oppdaterer hurtigbufferen ved hver skriveoperasjon og dermed eliminerer foreldede data, men sløser med minne for data som ikke leses, og at eksplisitt ugyldiggjøring sletter hurtigbuffernøkler ved databaseoppdateringer for å fjerne vinduer med foreldede data. Deretter skal vi se nærmere på lagring av økter og mønstre for ledertavler med ElastiCache.
Lær deg Cloud & IT Cert Prep med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 150
- Leksjoner
- 600
Ofte stilte spørsmål
Er leksjonen «Bufringsstrategier: Lazy Loading og Write-Through» gratis?
Ja – hele teksten i «Bufringsstrategier: Lazy Loading og Write-Through» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Cloud & IT Cert Prep-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Cloud & IT Cert Prep inneholder totalt 4 leksjoner.
Hva lærer jeg i «Bufringsstrategier: Lazy Loading og Write-Through»?
Implementer lazy loading for å fylle bufferen ved cache-miss, og write-through for å holde bufferen konsistent med hver databaseskriving Du øver på Cloud & IT Cert Prep med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Cloud & IT Cert Prep?
Ingen tidligere erfaring er nødvendig. Cloud & IT Cert Prep på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Bufringsstrategier: Lazy Loading og Write-Through»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Cloud & IT Cert Prep-leksjonen?
Ja. Alle Cloud & IT Cert Prep-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Redis kontra Memcached: Velg riktig motor
- ElastiCache Redis-replikeringsgrupper og klyngemodus
- Bufringsstrategier: Lazy Loading og Write-Through
- Øktlagring og mønstre for ledertavler