"""缓存装饰器。 为热点接口自动添加 Redis 缓存。 """ import functools import hashlib import logging from typing import Any, Callable from app.core.redis import cache_get, cache_set logger = logging.getLogger(__name__) def cached(prefix: str, ttl: int = 300): """缓存装饰器 — 自动缓存函数返回值。 Args: prefix: 缓存键前缀 ttl: 缓存过期时间(秒) """ def decorator(func: Callable) -> Callable: @functools.wraps(func) async def wrapper(*args, **kwargs) -> Any: # 生成缓存键 key_parts = [prefix] for arg in args[1:]: # 跳过 self/db key_parts.append(str(arg)) for k, v in sorted(kwargs.items()): key_parts.append(f"{k}={v}") cache_key = hashlib.md5(":".join(key_parts).encode()).hexdigest() # 尝试获取缓存 cached = await cache_get(f"{prefix}:{cache_key}") if cached is not None: return cached # 执行函数 result = await func(*args, **kwargs) # 写入缓存 await cache_set(f"{prefix}:{cache_key}", result, ttl) return result return wrapper return decorator