mirror of
https://github.com/fawney19/Aether.git
synced 2026-01-03 08:12:26 +08:00
126 lines
4.1 KiB
Python
126 lines
4.1 KiB
Python
|
|
"""
|
|||
|
|
缓存失效服务
|
|||
|
|
|
|||
|
|
统一管理各种缓存的失效逻辑,支持:
|
|||
|
|
1. GlobalModel 变更时失效相关缓存
|
|||
|
|
2. ModelMapping 变更时失效别名/降级缓存
|
|||
|
|
3. Model 变更时失效模型映射缓存
|
|||
|
|
4. 支持同步和异步缓存后端
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import asyncio
|
|||
|
|
from typing import Optional
|
|||
|
|
|
|||
|
|
from src.core.logger import logger
|
|||
|
|
|
|||
|
|
from src.core.logger import logger
|
|||
|
|
|
|||
|
|
|
|||
|
|
class CacheInvalidationService:
|
|||
|
|
"""
|
|||
|
|
缓存失效服务
|
|||
|
|
|
|||
|
|
提供统一的缓存失效接口,当数据库模型变更时自动清理相关缓存
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
def __init__(self):
|
|||
|
|
"""初始化缓存失效服务"""
|
|||
|
|
self._mapping_resolver = None
|
|||
|
|
self._model_mappers = [] # 可能有多个 ModelMapperMiddleware 实例
|
|||
|
|
|
|||
|
|
def set_mapping_resolver(self, mapping_resolver):
|
|||
|
|
"""设置模型映射解析器实例"""
|
|||
|
|
self._mapping_resolver = mapping_resolver
|
|||
|
|
logger.debug(f"[CacheInvalidation] 模型映射解析器已注册 (实例: {id(mapping_resolver)})")
|
|||
|
|
|
|||
|
|
def register_model_mapper(self, model_mapper):
|
|||
|
|
"""注册 ModelMapper 实例"""
|
|||
|
|
if model_mapper not in self._model_mappers:
|
|||
|
|
self._model_mappers.append(model_mapper)
|
|||
|
|
logger.debug(f"[CacheInvalidation] ModelMapper 已注册 (实例: {id(model_mapper)},总数: {len(self._model_mappers)})")
|
|||
|
|
|
|||
|
|
def on_global_model_changed(self, model_name: str):
|
|||
|
|
"""
|
|||
|
|
GlobalModel 变更时的缓存失效
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
model_name: 变更的 GlobalModel.name
|
|||
|
|
"""
|
|||
|
|
logger.info(f"[CacheInvalidation] GlobalModel 变更: {model_name}")
|
|||
|
|
|
|||
|
|
# 异步失效模型解析器中的缓存
|
|||
|
|
if self._mapping_resolver:
|
|||
|
|
asyncio.create_task(self._mapping_resolver.invalidate_global_model_cache())
|
|||
|
|
|
|||
|
|
# 失效所有 ModelMapper 中与此模型相关的缓存
|
|||
|
|
for mapper in self._model_mappers:
|
|||
|
|
# 清空所有缓存(因为不知道哪些 provider 使用了这个模型)
|
|||
|
|
mapper.clear_cache()
|
|||
|
|
logger.debug(f"[CacheInvalidation] 已清空 ModelMapper 缓存")
|
|||
|
|
|
|||
|
|
def on_model_mapping_changed(self, source_model: str, provider_id: Optional[str] = None):
|
|||
|
|
"""
|
|||
|
|
ModelMapping 变更时的缓存失效
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
source_model: 变更的源模型名
|
|||
|
|
provider_id: 相关 Provider(None 表示全局)
|
|||
|
|
"""
|
|||
|
|
logger.info(f"[CacheInvalidation] ModelMapping 变更: {source_model} (provider={provider_id})")
|
|||
|
|
|
|||
|
|
if self._mapping_resolver:
|
|||
|
|
asyncio.create_task(
|
|||
|
|
self._mapping_resolver.invalidate_mapping_cache(source_model, provider_id)
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
for mapper in self._model_mappers:
|
|||
|
|
if provider_id:
|
|||
|
|
mapper.refresh_cache(provider_id)
|
|||
|
|
else:
|
|||
|
|
mapper.clear_cache()
|
|||
|
|
|
|||
|
|
def on_model_changed(self, provider_id: str, global_model_id: str):
|
|||
|
|
"""
|
|||
|
|
Model 变更时的缓存失效
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
provider_id: Provider ID
|
|||
|
|
global_model_id: GlobalModel ID
|
|||
|
|
"""
|
|||
|
|
logger.info(f"[CacheInvalidation] Model 变更: provider={provider_id[:8]}..., "
|
|||
|
|
f"global_model={global_model_id[:8]}...")
|
|||
|
|
|
|||
|
|
# 失效 ModelMapper 中特定 Provider 的缓存
|
|||
|
|
for mapper in self._model_mappers:
|
|||
|
|
mapper.refresh_cache(provider_id)
|
|||
|
|
|
|||
|
|
def clear_all_caches(self):
|
|||
|
|
"""清空所有缓存"""
|
|||
|
|
logger.info("[CacheInvalidation] 清空所有缓存")
|
|||
|
|
|
|||
|
|
if self._mapping_resolver:
|
|||
|
|
asyncio.create_task(self._mapping_resolver.clear_cache())
|
|||
|
|
|
|||
|
|
for mapper in self._model_mappers:
|
|||
|
|
mapper.clear_cache()
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 全局单例
|
|||
|
|
_cache_invalidation_service: Optional[CacheInvalidationService] = None
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_cache_invalidation_service() -> CacheInvalidationService:
|
|||
|
|
"""
|
|||
|
|
获取全局缓存失效服务实例
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
CacheInvalidationService 实例
|
|||
|
|
"""
|
|||
|
|
global _cache_invalidation_service
|
|||
|
|
|
|||
|
|
if _cache_invalidation_service is None:
|
|||
|
|
_cache_invalidation_service = CacheInvalidationService()
|
|||
|
|
logger.debug("[CacheInvalidation] 初始化缓存失效服务")
|
|||
|
|
|
|||
|
|
return _cache_invalidation_service
|