# File : app/cache/redis_cache.py # Purpose : Redis caching for RAG query responses import json import hashlib import redis.asyncio as aioredis from typing import Optional from app.config import get_settings settings = get_settings() _redis_client: Optional[aioredis.Redis] = None async def get_redis() -> aioredis.Redis: global _redis_client if _redis_client is None: _redis_client = aioredis.from_url( settings.redis_url, encoding="utf-8", decode_responses=True, ) return _redis_client def make_cache_key(user_id: str, query: str) -> str: raw = f"{user_id}:{query.strip().lower()}" return "rag:" + hashlib.md5(raw.encode()).hexdigest() async def get_cached_response(user_id: str, query: str) -> Optional[dict]: try: redis = await get_redis() key = make_cache_key(user_id, query) cached = await redis.get(key) if cached: print(f"[CACHE] Hit for key: {key}") return json.loads(cached) except Exception as e: print(f"[CACHE] Redis get error: {e}") return None async def set_cached_response(user_id: str, query: str, response: dict) -> None: try: redis = await get_redis() key = make_cache_key(user_id, query) await redis.setex(key, settings.redis_ttl_seconds, json.dumps(response)) print(f"[CACHE] Stored key: {key}") except Exception as e: print(f"[CACHE] Redis set error: {e}")