import json from typing import Optional, List, Dict, Any import redis.asyncio as redis from app.core.config import settings class CacheService: def __init__(self): self.redis_client: Optional[redis.Redis] = None async def connect(self): """Подключение к Redis""" self.redis_client = await redis.from_url( settings.redis_url, encoding="utf-8", decode_responses=True ) async def disconnect(self): """Отключение от Redis""" if self.redis_client: await self.redis_client.close() async def get(self, key: str) -> Optional[str]: """Получить значение по ключу""" if not self.redis_client: await self.connect() return await self.redis_client.get(key) async def set(self, key: str, value: str, expire: int = 3600): """Установить значение с TTL""" if not self.redis_client: await self.connect() await self.redis_client.setex(key, expire, value) async def delete(self, key: str): """Удалить ключ""" if not self.redis_client: await self.connect() await self.redis_client.delete(key) async def get_conversation_context( self, conversation_id: str ) -> List[Dict[str, Any]]: """Получить контекст разговора""" key = f"conversation:{conversation_id}" data = await self.get(key) if data: return json.loads(data) return [] async def save_conversation_context( self, conversation_id: str, context: List[Dict[str, Any]], expire: int = 86400 * 7 # 7 дней ): """Сохранить контекст разговора""" key = f"conversation:{conversation_id}" await self.set(key, json.dumps(context), expire=expire) async def cache_token(self, token: str, expire: int = 1800): """Кэшировать токен (для rate limiting)""" key = f"token:{token}" await self.set(key, "1", expire=expire) cache_service = CacheService()