init
This commit is contained in:
70
new-planet-backend/app/services/cache_service.py
Normal file
70
new-planet-backend/app/services/cache_service.py
Normal file
@@ -0,0 +1,70 @@
|
||||
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()
|
||||
|
||||
Reference in New Issue
Block a user