キャッシュ設計と実装
適切なキャッシュ戦略で、アプリケーションのパフォーマンスを大幅に向上させます。AIにキャッシュ設計を相談しながら実装しましょう。
キャッシュ戦略の種類
Cache-Aside(キャッシュアサイド)
アプリケーションがキャッシュを管理。最も一般的なパターン。
1. キャッシュ確認 → 2. なければDBから取得 → 3. キャッシュに保存
Write-Through(ライトスルー)
書き込み時にキャッシュとDBを同時に更新。
Write-Behind(ライトビハインド)
キャッシュに書き込み、DBへの反映は非同期で行う。
Redis でのキャッシュ実装
AIへの指示
FastAPI + Redis でキャッシュを実装してください。 【要件】 - ユーザー情報の取得をキャッシュ(TTL: 5分) - キャッシュキーの設計 - キャッシュの無効化(ユーザー更新時) - デコレータでキャッシュを適用 実装例を示してください。
キャッシュデコレータ
import redis
import json
from functools import wraps
redis_client = redis.Redis(host='localhost', port=6379, db=0)
def cache(prefix: str, ttl: int = 300):
def decorator(func):
@wraps(func)
async def wrapper(*args, **kwargs):
cache_key = f"{prefix}:{args}:{kwargs}"
# キャッシュ確認
cached = redis_client.get(cache_key)
if cached:
return json.loads(cached)
# DBから取得
result = await func(*args, **kwargs)
# キャッシュに保存
redis_client.setex(cache_key, ttl, json.dumps(result))
return result
return wrapper
return decorator
# 使用例
@cache(prefix="user", ttl=300)
async def get_user(user_id: int):
return await db.query(User).filter(User.id == user_id).first()
キャッシュ無効化
def invalidate_user_cache(user_id: int):
"""ユーザー更新時にキャッシュを削除"""
pattern = f"user:*{user_id}*"
for key in redis_client.scan_iter(match=pattern):
redis_client.delete(key)
まとめ
- ✓Cache-Aside が最も一般的
- ✓TTL を適切に設定 - データの更新頻度に応じて
- ✓キャッシュ無効化 - 更新時に確実に削除