Spaces:
Running
Running
| import redis | |
| import hashlib | |
| import json | |
| from typing import Optional, Dict, Any | |
| from ..config import settings | |
| import logging | |
| logger = logging.getLogger(__name__) | |
| class CacheService: | |
| def __init__(self): | |
| try: | |
| self.redis = redis.from_url(settings.REDIS_URL, decode_responses=True) | |
| except Exception as e: | |
| logger.error(f"Failed to connect to Redis: {e}") | |
| self.redis = None | |
| def _get_key(self, user_id: str, document_id: str, query: str, technique: str) -> str: | |
| data = f"{user_id}:{document_id}:{query}:{technique}" | |
| q_hash = hashlib.sha256(data.encode()).hexdigest() | |
| return f"rag_cache:{q_hash}" | |
| def get(self, user_id: str, document_id: str, query: str, technique: str) -> Optional[Dict[str, Any]]: | |
| if not self.redis: return None | |
| key = self._get_key(user_id, document_id, query, technique) | |
| try: | |
| val = self.redis.get(key) | |
| if val: | |
| return json.loads(val) | |
| except Exception as e: | |
| logger.error(f"Redis get failed: {e}") | |
| return None | |
| def set(self, user_id: str, document_id: str, query: str, technique: str, response: Dict[str, Any]): | |
| if not self.redis: return | |
| key = self._get_key(user_id, document_id, query, technique) | |
| try: | |
| self.redis.setex(key, settings.CACHE_TTL_SECONDS, json.dumps(response)) | |
| except Exception as e: | |
| logger.error(f"Redis set failed: {e}") | |
| cache_service = CacheService() | |