Bootcamp i backendutveckling med FastAPI · Lektion

Cache-strategier med Redis

Integrera Redis för att cacha API-svar och ofta efterfrågade data för bättre prestanda.

Lektion 1 av 411 steg

Cache-strategier med Redis är en gratis lektion i Bootcamp i backendutveckling med FastAPI på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Bootcamp i backendutveckling med FastAPI, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Bootcamp i backendutveckling med FastAPI innehåller totalt 4 lektioner.

Varför cachning är viktigt

Föreställ dig att din app upprepade gånger hämtar samma data från en långsam databas eller en extern tjänst. Det gör upplevelsen långsammare för användarna!

Cachning innebär att ofta åtkomna data lagras på en snabbare, tillfällig plats. Det liknar en genväg för snabb åtkomst till information.

  • Snabbar upp svarstiderna: Användarna får data snabbare.
  • Minskar belastningen: Databaser och API:er belastas mindre.
  • Förbättrar prestandan: Applikationen känns snabbare och kan hantera fler användare.

Möt Redis: en snabb cache

Redis (Remote Dictionary Server) är ett datalager med öppen källkod som lagrar data i minnet. Att data lagras i minnet innebär att den finns i RAM, vilket gör Redis otroligt snabbt!

Det kallas ofta för ett ”datalager för datastrukturer” eftersom det stöder olika datatyper som strängar, hashar, listor och mängder – inte bara enkla nyckel-värde-par.

Vid cachning i FastAPI fungerar Redis som ett blixtsnabbt nyckel-värde-lager, perfekt för att lagra API-svar.

Så fungerar cachning med Redis

När en FastAPI-endpoint behöver data kontrollerar den först Redis.

  • Cacheträff: Om data finns i Redis returneras den omedelbart. Det går mycket snabbt!
  • Cachemiss: Om data inte finns i Redis hämtar FastAPI den från den ursprungliga källan, till exempel en databas. Innan data returneras lagras en kopia i Redis för framtida förfrågningar.

Den här strategin gör att efterföljande förfrågningar efter samma data kan dra nytta av cachens hastighet.

Ansluta FastAPI till Redis

För att använda Redis med Python använder vi biblioteket redis-py (närmare bestämt dess asynkrona version, redis.asyncio). Installera det först: pip install redis.

Upprätta sedan en anslutning till Redis-servern. Ni kan injicera den här anslutningen som ett beroende i FastAPI-applikationen.

Så här skapar ni en enkel asynkron Redis-klient och testar anslutningen:

import redis.asyncio as redis
import asyncio

async def connect_to_redis():
    # Connect to Redis server (default host/port)
    r = redis.Redis(host='localhost', port=6377, db=0, decode_responses=True)
    try:
        # Ping to check connection
        await r.ping()
        print("Successfully connected to Redis!")
    except redis.exceptions.ConnectionError as e:
        print(f"Could not connect to Redis: {e}")
    finally:
        # Close the connection when done
        await r.close()

if __name__ == "__main__":
    # Run the async function
    asyncio.run(connect_to_redis())

Grundläggande SET- och GET-operationer

Redis är ett nyckel-värde-lager. Ni använder SET för att lagra ett värde som hör ihop med en unik nyckel och GET för att hämta det.

Parametern decode_responses=True i klientkonfigurationen ser till att hämtade bytevärden automatiskt avkodas till Python-strängar.

Här är ett enkelt exempel på hur ni lagrar och hämtar en sträng:

import redis.asyncio as redis
import asyncio

async def basic_cache_example():
    r = redis.Redis(host='localhost', port=6377, db=0, decode_responses=True)
    key = "app:greeting"
    value = "Hello from your Redis cache!"

    # Store a value with a key
    await r.set(key, value)
    print(f"Set key '{key}' with value: '{value}'")

    # Retrieve the value using its key
    cached_value = await r.get(key)
    print(f"Retrieved value for '{key}': '{cached_value}'")

    await r.close()

if __name__ == "__main__":
    asyncio.run(basic_cache_example())

Cacha komplexa data (JSON)

API-svar består vanligtvis av komplexa datastrukturer, till exempel Python-ordböcker, som sedan serialiseras till JSON. Redis lagrar strängvärden.

För att cacha en ordlista konverterar vi den först till en JSON-sträng med Pythons inbyggda modul json. När vi hämtar den tolkar vi JSON-strängen tillbaka till en ordlista.

Det gör att vi effektivt kan cacha omfattande dataobjekt.

import redis.asyncio as redis
import asyncio
import json

async def cache_json_object_example():
    r = redis.Redis(host='localhost', port=6377, db=0, decode_responses=True)
    
    user_id = "user_456"
    user_profile = {"name": "Alice", "email": "alice@example.com", "age": 30}
    
    # Convert Python dict to JSON string
    json_profile = json.dumps(user_profile)
    
    # Store the JSON string in Redis
    await r.set(f"user:{user_id}", json_profile)
    print(f"Cached user profile for {user_id}")
    
    # Retrieve the JSON string from Redis
    cached_json = await r.get(f"user:{user_id}")
    if cached_json:
        # Convert JSON string back to Python dict
        retrieved_profile = json.loads(cached_json)
        print(f"Retrieved user name: {retrieved_profile['name']}")
    
    await r.close()

if __name__ == "__main__":
    asyncio.run(cache_json_object_example())

Hantera cachens giltighetstid (TTL)

Cachad data kan bli ”inaktuell” om den ursprungliga datan i databasen ändras. Att leverera inaktuell data kan vara värre än att inte ha någon cache alls!

Time-To-Live (TTL) är ett viktigt begrepp. Det är en tidsperiod, angiven i sekunder, efter vilken ett cachat objekt automatiskt tas bort från Redis.

Med TTL hålls cachen uppdaterad, så att ni inte behöver leverera föråldrad information manuellt.

Cachning med TTL i FastAPI

När ni använder kommandot SET i Redis kan ni lägga till parametern ex för att ange giltighetstiden i sekunder (eller px för millisekunder).

Det här exemplet visar en FastAPI-endpoint som cachar ett objekt i 60 sekunder. Om ni begär samma objekt inom 60 sekunder levereras det från cachen. Annars hämtas det på nytt från den simulerade databasen.

from fastapi import FastAPI, Depends
import redis.asyncio as redis
import asyncio
import json

app = FastAPI()

# Dependency to get a Redis client instance
async def get_redis_client():
    r = redis.Redis(host='localhost', port=6377, db=0, decode_responses=True)
    try:
        yield r # Provide the client
    finally:
        await r.close() # Ensure client is closed after request

@app.get("/products/{product_id}")
async def read_product(product_id: str, redis_client: redis.Redis = Depends(get_redis_client)):
    cache_key = f"product:{product_id}"
    
    # 1. Try to get data from cache
    cached_data = await redis_client.get(cache_key)
    if cached_data:
        print(f"Cache hit for {product_id}!")
        return json.loads(cached_data)
    
    # 2. If not in cache, simulate fetching from database
    print(f"Cache miss for {product_id}. Fetching from DB...")
    await asyncio.sleep(1) # Simulate I/O delay for DB call
    product_data = {"id": product_id, "name": f"Product {product_id}", "price": 99.99}
    
    # 3. Store in cache with 60-second TTL
    await redis_client.set(cache_key, json.dumps(product_data), ex=60)
    
    return product_data

# To run this example:
# 1. Ensure a Redis server is running (e.g., `redis-server` in your terminal).
# 2. Save this code as `main.py`.
# 3. Run Uvicorn: `uvicorn main:app --reload`.
# 4. Access in your browser: `http://127.0.0.1:8000/products/123`.
#    Refresh the page to see 'Cache hit' messages after the first request.

Ogiltigförklara cache och viktiga överväganden

TTL hanterar automatisk borttagning, men ibland behöver ni ta bort ett objekt manuellt från cachen om källdatan ändras innan TTL löper ut.

Detta kallas cacheogiltigförklaring. Om en användare till exempel uppdaterar sin profil kan ni uttryckligen ta bort den gamla profildatan från cachen med redis_client.delete(key).

Överväg följande vid cachning:

  • Dataföränderlighet: Cacha inte mycket dynamisk data som ändras varje sekund.
  • Minnesanvändning: Redis lagrar data i RAM, så tänk på serverns minneskapacitet.
  • Datakonsistens: Hitta en balans mellan aktualitet och prestanda.

Snabbtest

Ni har lärt er om Redis och hur man implementerar grundläggande cachningsstrategier. Nu testar vi er förståelse av fördelarna.

Sammanfattning: cachning för bättre prestanda

Utmärkt arbete! Ni har utforskat hur Redis kan förbättra FastAPI-applikationens prestanda och skalbarhet avsevärt.

Här är en kort sammanfattning av det vi gick igenom:

  • Vad är cachning: Att lagra data tillfälligt för snabbare åtkomst.
  • Introduktion till Redis: Ett snabbt nyckel-värde-lager som lagrar data i minnet.
  • Ansluta till Redis: Använda redis.asyncio för klientanslutningen.
  • Grundläggande operationer: SET och GET för cachning av strängar och JSON.
  • Time-To-Live (TTL): Automatisk borttagning av cachad data med parametern ex.
  • Ogiltigförklaring: Ta bort inaktuell data manuellt.

Därefter kan ni utforska mer avancerade Redis-funktioner, som Pub/Sub för realtidsuppdateringar eller Redis Hashes för mer strukturerad cachad data.

Gratis att börja

Lär dig Bootcamp i backendutveckling med FastAPI 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
21
Lektioner
84

Vanliga frågor

Är lektionen ”Cache-strategier med Redis” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Bootcamp i backendutveckling med FastAPI, inklusive ”Cache-strategier med Redis”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Bootcamp i backendutveckling med FastAPI innehåller totalt 4 lektioner.

Vad lär jag mig i ”Cache-strategier med Redis”?

Integrera Redis för att cacha API-svar och ofta efterfrågade data för bättre prestanda. Ni övar på Bootcamp i backendutveckling med FastAPI 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 Bootcamp i backendutveckling med FastAPI?

Du behöver inga förkunskaper. Utbildningen i Bootcamp i backendutveckling med FastAPI 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 ”Cache-strategier med Redis”?

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 Bootcamp i backendutveckling med FastAPI-lektionen?

Ja. Varje Bootcamp i backendutveckling med FastAPI-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

  1. Cache-strategier med Redis
  2. Asynkron databasåtkomst
  3. Lastbalansering och övervakning
  4. Bakgrundsuppgifter och job queues
← Tillbaka till Bootcamp i backendutveckling med FastAPI