7.11 Caching¶
Caching adalah mekanisme penyimpanan sementara data untuk mengurangi beban sistem, mempercepat waktu respons, dan meningkatkan performa aplikasi. Dalam konteks API, caching dapat dilakukan pada berbagai tingkat, termasuk respons API dan query database.
7.11.1 Response Caching¶
Response caching menyimpan hasil respons API sehingga permintaan berikutnya untuk data yang sama tidak perlu diproses ulang. Ini sangat berguna untuk data yang jarang berubah.
Cara Implementasi di FastAPI¶
- Gunakan Header
Cache-Control
Tambahkan header Cache-Control
untuk mengatur durasi penyimpanan cache di klien atau CDN.
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.get("/cached-response")
def get_cached_response():
data = {"message": "Data ini akan di-cache"}
response = JSONResponse(content=data)
response.headers["Cache-Control"] = "public, max-age=3600" # Cache selama 1 jam
return response
- Gunakan Middleware untuk Response Caching
API dapat menggunakan middleware seperti Starlette's BaseHTTPMiddleware untuk mengimplementasikan caching lebih lanjut.
7.11.2 Database Query Caching¶
Database query caching menyimpan hasil query database sehingga query yang sama di masa depan dapat dijawab lebih cepat tanpa mengeksekusi ulang query.
Menggunakan Redis untuk Query Caching di FastAPI¶
Redis adalah database in-memory yang cepat dan populer untuk caching.
Langkah Implementasi di FastAPI¶
-
Instalasi Redis dan Library Redis untuk Python: Install Redis dan library
redis-py
-
Konfigurasi Redis Connection: Buat koneksi ke Redis
-
Caching Query Database: Gunakan Redis untuk menyimpan hasil query
from fastapi import FastAPI, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from redis import Redis from app.models import User # Ganti dengan model Anda app = FastAPI() # Redis connection redis_client = Redis(host="localhost", port=6379, db=0) @app.get("/users/{user_id}") async def get_user(user_id: int, db: AsyncSession): cache_key = f"user:{user_id}" # Cek data di cache Redis cached_data = redis_client.get(cache_key) if cached_data: return {"source": "cache", "data": cached_data.decode("utf-8")} # Jika tidak ada di cache, query database query = select(User).where(User.id == user_id) result = await db.execute(query) user = result.scalar() if not user: raise HTTPException(status_code=404, detail="User not found") # Simpan data ke Redis dengan waktu kadaluarsa 1 jam redis_client.setex(cache_key, 3600, str(user.dict())) return {"source": "database", "data": user.dict()}
-
Menghapus Cache Saat Data Diupdate: Ketika data berubah, pastikan cache dihapus atau diperbarui untuk menjaga konsistensi
@app.put("/users/{user_id}") async def update_user(user_id: int, user_data: dict, db: AsyncSession): query = select(User).where(User.id == user_id) result = await db.execute(query) user = result.scalar() if not user: raise HTTPException(status_code=404, detail="User not found") # Update data di database for key, value in user_data.items(): setattr(user, key, value) db.add(user) await db.commit() # Hapus cache yang terkait cache_key = f"user:{user_id}" redis_client.delete(cache_key) return {"message": "User updated", "data": user_data}
Best Practices untuk Caching¶
- Tetapkan Expiration Time: Semua cache harus memiliki waktu kedaluwarsa (
TTL
) untuk menghindari penyimpanan data lama yang tidak relevan. - Cache Hanya Data yang Sering Diakses: Tidak semua data perlu dicache. Prioritaskan data yang mahal untuk dihasilkan atau sering diminta.
- Gunakan Cache Invalidation: Pastikan cache diperbarui atau dihapus saat data dasar berubah.
- Monitoring dan Debugging: Gunakan alat seperti Redis Insight untuk memantau performa dan penggunaan Redis.
Keuntungan Caching¶
Beberapa keuntungan dari caching adalah sebagai berikut:
- Mengurangi beban database.
- Meningkatkan kecepatan respons API.
- Menyediakan fallback data jika sistem backend tidak tersedia sementara.
Caching adalah alat yang kuat untuk meningkatkan performa sistem, tetapi harus digunakan dengan hati-hati untuk memastikan konsistensi data.