In today’s digital world, every action—whether it’s swiping on a dating app or completing a purchase—relies on APIs working efficiently behind the scenes. As back-end developers, we know that every millisecond counts. But how can we make APIs respond faster? The answer lies in caching.
Caching is a technique that stores frequently accessed data in memory, allowing APIs to respond instantly instead of querying a slower database every time. Think of it like keeping key ingredients (salt, pepper, oil) on your kitchen countertop instead of fetching them from the pantry each time you cook—this saves time and makes the process more efficient. Similarly, caching reduces API response times by storing commonly requested data in a fast, accessible spot, like Redis.
To connect with Redis Cache with FastAPI, we require the following libraries to be pre-installed.
pip install fastapi uvicorn aiocache pydantic
Pydantic is for creating database tables and structures. aiocache will perform asynchronous operations on Cache. uvicorn is responsible for the server running.
Setting up Redis directly in a Windows system is not possible at this juncture. Therefore, it has to be setup and run in Windows Subsystem for Linux. Instructions for installing WSL is given below
Post installing WSL, the following commands are required to install Redis
sudo apt update sudo apt install redis-server sudo systemctl start redis
To test Redis server connectivity, the following command is used
redis-cli
After this command, it will enter into a virtual terminal of port 6379. In that terminal, the redis commands can be typed and tested.
Let’s create a simple FastAPI app that retrieves user information and caches it for future requests. We will use Redis for storing cached responses.
We’ll use Pydantic to define our User model, which represents the structure of the API response.
from pydantic import BaseModel class User(BaseModel): id: int name: str email: str age: int
To avoid repeating the caching logic for each endpoint, we’ll create a reusable caching decorator using the aiocache library. This decorator will attempt to retrieve the response from Redis before calling the actual function.
import json from functools import wraps from aiocache import Cache from fastapi import HTTPException def cache_response(ttl: int = 60, namespace: str = "main"): """ Caching decorator for FastAPI endpoints. ttl: Time to live for the cache in seconds. namespace: Namespace for cache keys in Redis. """ def decorator(func): @wraps(func) async def wrapper(*args, **kwargs): user_id = kwargs.get('user_id') or args[0] # Assuming the user ID is the first argument cache_key = f"{namespace}:user:{user_id}" cache = Cache.REDIS(endpoint="localhost", port=6379, namespace=namespace) # Try to retrieve data from cache cached_value = await cache.get(cache_key) if cached_value: return json.loads(cached_value) # Return cached data # Call the actual function if cache is not hit response = await func(*args, **kwargs) try: # Store the response in Redis with a TTL await cache.set(cache_key, json.dumps(response), ttl=ttl) except Exception as e: raise HTTPException(status_code=500, detail=f"Error caching data: {e}") return response return wrapper return decorator
We’ll now implement a FastAPI route that retrieves user information based on a user ID. The response will be cached using Redis for faster access in subsequent requests.
from fastapi import FastAPI app = FastAPI() # Sample data representing users in a database users_db = { 1: {"id": 1, "name": "Alice", "email": "alice@example.com", "age": 25}, 2: {"id": 2, "name": "Bob", "email": "bob@example.com", "age": 30}, 3: {"id": 3, "name": "Charlie", "email": "charlie@example.com", "age": 22}, } @app.get("/users/{user_id}") @cache_response(ttl=120, namespace="users") async def get_user_details(user_id: int): # Simulate a database call by retrieving data from users_db user = users_db.get(user_id) if not user: raise HTTPException(status_code=404, detail="User not found") return user
Start your FastAPI application by running:
uvicorn main:app --reload
Now, you can test the API by fetching user details via:
http://127.0.0.1:8000/users/1
The first request will fetch the data from the users_db, but subsequent requests will retrieve the data from Redis.
You can verify the cache by inspecting the keys stored in Redis. Open the Redis CLI:
redis-cli KEYS *
You will get all keys that have been stored in the Redis till TTL.
: When the user data is requested for the first time, the API fetches it from the database (users_db) and stores the result in Redis with a time-to-live (TTL) of 120 seconds.
Any subsequent requests for the same user within the TTL period are served directly from Redis, making the response faster and reducing the load on the database.
After 120 seconds, the cache entry expires, and the data is fetched from the database again on the next request, refreshing the cache.
In this tutorial, we’ve demonstrated how to implement Redis caching in a FastAPI application using a simple user details example. By caching API responses, you can significantly improve the performance of your application, particularly for data that doesn't change frequently.
Please do upvote and share if you find this article useful.
Atas ialah kandungan terperinci Caching dalam FastAPI: Membuka Kunci Pembangunan Berprestasi Tinggi:. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!