Spaces:
Runtime error
Runtime error
| # 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}") |