第3部:AIとバックエンド高度化 Step 9 / 36

キャッシュ設計と実装

適切なキャッシュ戦略で、アプリケーションのパフォーマンスを大幅に向上させます。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 を適切に設定 - データの更新頻度に応じて
  • キャッシュ無効化 - 更新時に確実に削除
非同期処理の実装 次へ:データベース最適化