initial commit
This commit is contained in:
57
api/app/cache.py
Normal file
57
api/app/cache.py
Normal file
@@ -0,0 +1,57 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import logging
|
||||
from typing import Any
|
||||
|
||||
import redis.asyncio as redis
|
||||
|
||||
from app.config import REDIS_URL
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
_client: redis.Redis | None = None
|
||||
|
||||
|
||||
async def init_redis() -> None:
|
||||
global _client
|
||||
try:
|
||||
_client = redis.from_url(REDIS_URL, decode_responses=True)
|
||||
await _client.ping()
|
||||
logger.info("Redis connected")
|
||||
except Exception as exc:
|
||||
logger.warning("Redis unavailable, running without Redis cache: %s", exc)
|
||||
_client = None
|
||||
|
||||
|
||||
async def close_redis() -> None:
|
||||
global _client
|
||||
if _client is not None:
|
||||
await _client.aclose()
|
||||
_client = None
|
||||
|
||||
|
||||
def redis_available() -> bool:
|
||||
return _client is not None
|
||||
|
||||
|
||||
async def cache_get(key: str) -> Any | None:
|
||||
if _client is None:
|
||||
return None
|
||||
raw = await _client.get(key)
|
||||
if raw is None:
|
||||
return None
|
||||
try:
|
||||
return json.loads(raw)
|
||||
except json.JSONDecodeError:
|
||||
return raw
|
||||
|
||||
|
||||
async def cache_set(key: str, value: Any, ttl_seconds: int) -> None:
|
||||
if _client is None:
|
||||
return
|
||||
await _client.set(key, json.dumps(value), ex=ttl_seconds)
|
||||
|
||||
|
||||
async def flush_cache() -> None:
|
||||
if _client is not None:
|
||||
await _client.flushdb()
|
||||
Reference in New Issue
Block a user