| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- """
- 缓存服务
- 提供Redis缓存操作,用于存储API密钥、模型信息和用户权限等数据,减轻数据库压力。
- """
- from typing import Optional, List, Dict, Any
- import json
- import logging
- from app.core.redis import redis_manager
- logger = logging.getLogger(__name__)
- class CacheService:
- """缓存服务类"""
-
- # 缓存键前缀
- API_KEY_PREFIX = "api_key:"
- MODEL_PREFIX = "model:"
- USER_PERMISSION_PREFIX = "user_permission:"
- USER_LOCAL_MODELS_PREFIX = "user_local_models:"
-
- # 缓存过期时间(秒)
- API_KEY_EXPIRE = 3600 # 1小时
- MODEL_EXPIRE = 7200 # 2小时
- PERMISSION_EXPIRE = 1800 # 30分钟
- USER_LOCAL_MODELS_EXPIRE = 1800 # 30分钟
-
- @classmethod
- async def get_api_key(cls, key_id: int) -> Optional[Dict[str, Any]]:
- """获取API密钥缓存"""
- redis = redis_manager.get_client()
- if not redis:
- return None
-
- try:
- data = await redis.get(f"{cls.API_KEY_PREFIX}{key_id}")
- return json.loads(data) if data else None
- except Exception as e:
- logger.warning(f"获取API密钥缓存失败: {e}")
- return None
-
- @classmethod
- async def set_api_key(cls, key_id: int, data: Dict[str, Any]):
- """设置API密钥缓存"""
- redis = redis_manager.get_client()
- if not redis:
- return
-
- try:
- await redis.setex(
- f"{cls.API_KEY_PREFIX}{key_id}",
- cls.API_KEY_EXPIRE,
- json.dumps(data)
- )
- except Exception as e:
- logger.warning(f"设置API密钥缓存失败: {e}")
-
- @classmethod
- async def get_model(cls, model_id: int) -> Optional[Dict[str, Any]]:
- """获取模型缓存"""
- redis = redis_manager.get_client()
- if not redis:
- return None
-
- try:
- data = await redis.get(f"{cls.MODEL_PREFIX}{model_id}")
- return json.loads(data) if data else None
- except Exception as e:
- logger.warning(f"获取模型缓存失败: {e}")
- return None
-
- @classmethod
- async def set_model(cls, model_id: int, data: Dict[str, Any]):
- """设置模型缓存"""
- redis = redis_manager.get_client()
- if not redis:
- return
-
- try:
- await redis.setex(
- f"{cls.MODEL_PREFIX}{model_id}",
- cls.MODEL_EXPIRE,
- json.dumps(data)
- )
- except Exception as e:
- logger.warning(f"设置模型缓存失败: {e}")
-
- @classmethod
- async def get_user_permission(cls, user_id: str, model_id: int) -> Optional[bool]:
- """获取用户权限缓存"""
- redis = redis_manager.get_client()
- if not redis:
- return None
-
- try:
- data = await redis.get(f"{cls.USER_PERMISSION_PREFIX}{user_id}:{model_id}")
- return data == "1" if data else None
- except Exception as e:
- logger.warning(f"获取用户权限缓存失败: {e}")
- return None
-
- @classmethod
- async def set_user_permission(cls, user_id: str, model_id: int, has_access: bool):
- """设置用户权限缓存"""
- redis = redis_manager.get_client()
- if not redis:
- return
-
- try:
- await redis.setex(
- f"{cls.USER_PERMISSION_PREFIX}{user_id}:{model_id}",
- cls.PERMISSION_EXPIRE,
- "1" if has_access else "0"
- )
- except Exception as e:
- logger.warning(f"设置用户权限缓存失败: {e}")
-
- @classmethod
- async def get_user_local_models(cls, user_id: str) -> Optional[List[int]]:
- """获取用户本地模型列表缓存"""
- redis = redis_manager.get_client()
- if not redis:
- return None
-
- try:
- data = await redis.get(f"{cls.USER_LOCAL_MODELS_PREFIX}{user_id}")
- return json.loads(data) if data else None
- except Exception as e:
- logger.warning(f"获取用户本地模型列表缓存失败: {e}")
- return None
-
- @classmethod
- async def set_user_local_models(cls, user_id: str, model_ids: List[int]):
- """设置用户本地模型列表缓存"""
- redis = redis_manager.get_client()
- if not redis:
- return
-
- try:
- await redis.setex(
- f"{cls.USER_LOCAL_MODELS_PREFIX}{user_id}",
- cls.USER_LOCAL_MODELS_EXPIRE,
- json.dumps(model_ids)
- )
- except Exception as e:
- logger.warning(f"设置用户本地模型列表缓存失败: {e}")
-
- @classmethod
- async def delete_api_key(cls, key_id: int):
- """删除API密钥缓存"""
- redis = redis_manager.get_client()
- if not redis:
- return
-
- try:
- await redis.delete(f"{cls.API_KEY_PREFIX}{key_id}")
- except Exception as e:
- logger.warning(f"删除API密钥缓存失败: {e}")
-
- @classmethod
- async def delete_model(cls, model_id: int):
- """删除模型缓存"""
- redis = redis_manager.get_client()
- if not redis:
- return
-
- try:
- await redis.delete(f"{cls.MODEL_PREFIX}{model_id}")
- except Exception as e:
- logger.warning(f"删除模型缓存失败: {e}")
-
- @classmethod
- async def delete_user_permission(cls, user_id: str, model_id: int):
- """删除用户权限缓存"""
- redis = redis_manager.get_client()
- if not redis:
- return
-
- try:
- await redis.delete(f"{cls.USER_PERMISSION_PREFIX}{user_id}:{model_id}")
- except Exception as e:
- logger.warning(f"删除用户权限缓存失败: {e}")
-
- @classmethod
- async def delete_user_local_models(cls, user_id: str):
- """删除用户本地模型列表缓存"""
- redis = redis_manager.get_client()
- if not redis:
- return
-
- try:
- await redis.delete(f"{cls.USER_LOCAL_MODELS_PREFIX}{user_id}")
- except Exception as e:
- logger.warning(f"删除用户本地模型列表缓存失败: {e}")
|