69 lines
1.8 KiB
Python
69 lines
1.8 KiB
Python
import asyncio
|
|
import hashlib
|
|
import json
|
|
import redis.asyncio as redis
|
|
from ..core import get_settings
|
|
|
|
settings = get_settings()
|
|
|
|
|
|
class CacheService:
|
|
def __init__(self):
|
|
self.redis: redis.Redis | None = None
|
|
|
|
async def connect(self):
|
|
try:
|
|
self.redis = redis.from_url(settings.redis_url)
|
|
await self.redis.ping()
|
|
except Exception:
|
|
self.redis = None
|
|
|
|
async def disconnect(self):
|
|
if self.redis:
|
|
await self.redis.close()
|
|
|
|
def _make_key(
|
|
self,
|
|
source_text: str,
|
|
source_lang: str,
|
|
target_lang: str,
|
|
style: str,
|
|
glossary_version: str | None = None,
|
|
model_version: str | None = None,
|
|
) -> str:
|
|
normalized = source_text.strip().lower()
|
|
content = f"{normalized}:{source_lang}:{target_lang}:{style}"
|
|
if glossary_version:
|
|
content += f":{glossary_version}"
|
|
if model_version:
|
|
content += f":{model_version}"
|
|
hash_val = hashlib.sha256(content.encode()).hexdigest()[:16]
|
|
return f"tr:{hash_val}"
|
|
|
|
async def get(self, key: str) -> dict | None:
|
|
if not self.redis:
|
|
return None
|
|
try:
|
|
data = await self.redis.get(key)
|
|
except asyncio.CancelledError:
|
|
return None
|
|
except Exception:
|
|
return None
|
|
if data:
|
|
return json.loads(data)
|
|
return None
|
|
|
|
async def set(self, key: str, value: dict, ttl: int | None = None):
|
|
if not self.redis:
|
|
return
|
|
ttl = ttl or settings.cache_ttl_seconds
|
|
try:
|
|
await self.redis.set(key, json.dumps(value), ex=ttl)
|
|
except asyncio.CancelledError:
|
|
return
|
|
except Exception:
|
|
return
|
|
|
|
|
|
cache_service = CacheService()
|