feat: 为高频查询添加多级缓存支持

- 为get_or_create_person添加10分钟缓存(PersonInfo高频查询)
- 为get_user_relationship添加5分钟缓存(关系查询优化)
- 为get_or_create_chat_stream添加5分钟缓存(聊天流优化)
- 在update_person_affinity和update_relationship_affinity中添加缓存失效
- 新增generate_cache_key辅助函数用于手动缓存管理
- 使用现有的@cached装饰器和MultiLevelCache系统

性能提升:
- PersonInfo查询命中缓存时可减少90%+数据库访问
- 关系查询在高频场景下显著降低数据库压力
- L1/L2缓存架构确保热数据快速访问
This commit is contained in:
Windpicker-owo
2025-11-01 15:39:26 +08:00
parent 17e1c186b5
commit dcc2bafc9f
3 changed files with 60 additions and 1 deletions

View File

@@ -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,

View File

@@ -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]])