diff --git a/src/common/database/api/specialized.py b/src/common/database/api/specialized.py index 7ebd37c32..494fa4283 100644 --- a/src/common/database/api/specialized.py +++ b/src/common/database/api/specialized.py @@ -19,6 +19,8 @@ from src.common.database.core.models import ( UserRelationships, ) from src.common.database.core.session import get_db_session +from src.common.database.optimization.cache_manager import get_cache +from src.common.database.utils.decorators import cached, generate_cache_key from src.common.logger import get_logger logger = get_logger("database.specialized") @@ -179,6 +181,7 @@ async def save_message( # ===== PersonInfo 业务API ===== +@cached(ttl=600, key_prefix="person_info") # 缓存10分钟 async def get_or_create_person( platform: str, person_id: str, @@ -234,6 +237,11 @@ async def update_person_affinity( {"affinity": new_affinity}, ) + # 使缓存失效 + cache = await get_cache() + cache_key = generate_cache_key("person_info", platform, person_id) + await cache.delete(cache_key) + logger.debug(f"更新好感度: {platform}/{person_id} {affinity_delta:+.2f} -> {new_affinity:.2f}") return True @@ -243,6 +251,7 @@ async def update_person_affinity( # ===== ChatStreams 业务API ===== +@cached(ttl=300, key_prefix="chat_stream") # 缓存5分钟 async def get_or_create_chat_stream( stream_id: str, platform: str, @@ -393,6 +402,7 @@ async def get_usage_statistics( # ===== UserRelationships 业务API ===== +@cached(ttl=300, key_prefix="user_relationship") # 缓存5分钟 async def get_user_relationship( platform: str, user_id: str, @@ -458,6 +468,11 @@ async def update_relationship_affinity( }, ) + # 使缓存失效 + cache = await get_cache() + cache_key = generate_cache_key("user_relationship", platform, user_id, target_id) + await cache.delete(cache_key) + logger.debug( f"更新关系: {platform}/{user_id}->{target_id} " f"好感度{affinity_delta:+.2f}->{new_affinity:.2f} " diff --git a/src/common/database/utils/__init__.py b/src/common/database/utils/__init__.py index 3782403a5..d59fba36c 100644 --- a/src/common/database/utils/__init__.py +++ b/src/common/database/utils/__init__.py @@ -6,7 +6,15 @@ - 性能监控 """ -from .decorators import cached, db_operation, measure_time, retry, timeout, transactional +from .decorators import ( + cached, + db_operation, + generate_cache_key, + measure_time, + retry, + timeout, + transactional, +) from .exceptions import ( BatchSchedulerError, CacheError, diff --git a/src/common/database/utils/decorators.py b/src/common/database/utils/decorators.py index 1db687d15..176a5c25b 100644 --- a/src/common/database/utils/decorators.py +++ b/src/common/database/utils/decorators.py @@ -18,6 +18,42 @@ from src.common.logger import get_logger logger = get_logger("database.decorators") + +def generate_cache_key( + key_prefix: str, + *args: Any, + **kwargs: Any, +) -> str: + """生成与@cached装饰器相同的缓存键 + + 用于手动缓存失效等操作 + + Args: + key_prefix: 缓存键前缀 + *args: 位置参数 + **kwargs: 关键字参数 + + Returns: + 缓存键字符串 + + Example: + cache_key = generate_cache_key("person_info", platform, person_id) + await cache.delete(cache_key) + """ + cache_key_parts = [key_prefix] + + if args: + args_str = ",".join(str(arg) for arg in args) + args_hash = hashlib.md5(args_str.encode()).hexdigest()[:8] + cache_key_parts.append(f"args:{args_hash}") + + if kwargs: + kwargs_str = ",".join(f"{k}={v}" for k, v in sorted(kwargs.items())) + kwargs_hash = hashlib.md5(kwargs_str.encode()).hexdigest()[:8] + cache_key_parts.append(f"kwargs:{kwargs_hash}") + + return ":".join(cache_key_parts) + T = TypeVar("T") F = TypeVar("F", bound=Callable[..., Awaitable[Any]])