cache_service.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. """
  2. 缓存服务
  3. 提供Redis缓存操作,用于存储API密钥、模型信息和用户权限等数据,减轻数据库压力。
  4. """
  5. from typing import Optional, List, Dict, Any
  6. import json
  7. import logging
  8. from app.core.redis import redis_manager
  9. logger = logging.getLogger(__name__)
  10. class CacheService:
  11. """缓存服务类"""
  12. # 缓存键前缀
  13. API_KEY_PREFIX = "api_key:"
  14. MODEL_PREFIX = "model:"
  15. USER_PERMISSION_PREFIX = "user_permission:"
  16. USER_LOCAL_MODELS_PREFIX = "user_local_models:"
  17. # 缓存过期时间(秒)
  18. API_KEY_EXPIRE = 3600 # 1小时
  19. MODEL_EXPIRE = 7200 # 2小时
  20. PERMISSION_EXPIRE = 1800 # 30分钟
  21. USER_LOCAL_MODELS_EXPIRE = 1800 # 30分钟
  22. @classmethod
  23. async def get_api_key(cls, key_id: int) -> Optional[Dict[str, Any]]:
  24. """获取API密钥缓存"""
  25. redis = redis_manager.get_client()
  26. if not redis:
  27. return None
  28. try:
  29. data = await redis.get(f"{cls.API_KEY_PREFIX}{key_id}")
  30. return json.loads(data) if data else None
  31. except Exception as e:
  32. logger.warning(f"获取API密钥缓存失败: {e}")
  33. return None
  34. @classmethod
  35. async def set_api_key(cls, key_id: int, data: Dict[str, Any]):
  36. """设置API密钥缓存"""
  37. redis = redis_manager.get_client()
  38. if not redis:
  39. return
  40. try:
  41. await redis.setex(
  42. f"{cls.API_KEY_PREFIX}{key_id}",
  43. cls.API_KEY_EXPIRE,
  44. json.dumps(data)
  45. )
  46. except Exception as e:
  47. logger.warning(f"设置API密钥缓存失败: {e}")
  48. @classmethod
  49. async def get_model(cls, model_id: int) -> Optional[Dict[str, Any]]:
  50. """获取模型缓存"""
  51. redis = redis_manager.get_client()
  52. if not redis:
  53. return None
  54. try:
  55. data = await redis.get(f"{cls.MODEL_PREFIX}{model_id}")
  56. return json.loads(data) if data else None
  57. except Exception as e:
  58. logger.warning(f"获取模型缓存失败: {e}")
  59. return None
  60. @classmethod
  61. async def set_model(cls, model_id: int, data: Dict[str, Any]):
  62. """设置模型缓存"""
  63. redis = redis_manager.get_client()
  64. if not redis:
  65. return
  66. try:
  67. await redis.setex(
  68. f"{cls.MODEL_PREFIX}{model_id}",
  69. cls.MODEL_EXPIRE,
  70. json.dumps(data)
  71. )
  72. except Exception as e:
  73. logger.warning(f"设置模型缓存失败: {e}")
  74. @classmethod
  75. async def get_user_permission(cls, user_id: str, model_id: int) -> Optional[bool]:
  76. """获取用户权限缓存"""
  77. redis = redis_manager.get_client()
  78. if not redis:
  79. return None
  80. try:
  81. data = await redis.get(f"{cls.USER_PERMISSION_PREFIX}{user_id}:{model_id}")
  82. return data == "1" if data else None
  83. except Exception as e:
  84. logger.warning(f"获取用户权限缓存失败: {e}")
  85. return None
  86. @classmethod
  87. async def set_user_permission(cls, user_id: str, model_id: int, has_access: bool):
  88. """设置用户权限缓存"""
  89. redis = redis_manager.get_client()
  90. if not redis:
  91. return
  92. try:
  93. await redis.setex(
  94. f"{cls.USER_PERMISSION_PREFIX}{user_id}:{model_id}",
  95. cls.PERMISSION_EXPIRE,
  96. "1" if has_access else "0"
  97. )
  98. except Exception as e:
  99. logger.warning(f"设置用户权限缓存失败: {e}")
  100. @classmethod
  101. async def get_user_local_models(cls, user_id: str) -> Optional[List[int]]:
  102. """获取用户本地模型列表缓存"""
  103. redis = redis_manager.get_client()
  104. if not redis:
  105. return None
  106. try:
  107. data = await redis.get(f"{cls.USER_LOCAL_MODELS_PREFIX}{user_id}")
  108. return json.loads(data) if data else None
  109. except Exception as e:
  110. logger.warning(f"获取用户本地模型列表缓存失败: {e}")
  111. return None
  112. @classmethod
  113. async def set_user_local_models(cls, user_id: str, model_ids: List[int]):
  114. """设置用户本地模型列表缓存"""
  115. redis = redis_manager.get_client()
  116. if not redis:
  117. return
  118. try:
  119. await redis.setex(
  120. f"{cls.USER_LOCAL_MODELS_PREFIX}{user_id}",
  121. cls.USER_LOCAL_MODELS_EXPIRE,
  122. json.dumps(model_ids)
  123. )
  124. except Exception as e:
  125. logger.warning(f"设置用户本地模型列表缓存失败: {e}")
  126. @classmethod
  127. async def delete_api_key(cls, key_id: int):
  128. """删除API密钥缓存"""
  129. redis = redis_manager.get_client()
  130. if not redis:
  131. return
  132. try:
  133. await redis.delete(f"{cls.API_KEY_PREFIX}{key_id}")
  134. except Exception as e:
  135. logger.warning(f"删除API密钥缓存失败: {e}")
  136. @classmethod
  137. async def delete_model(cls, model_id: int):
  138. """删除模型缓存"""
  139. redis = redis_manager.get_client()
  140. if not redis:
  141. return
  142. try:
  143. await redis.delete(f"{cls.MODEL_PREFIX}{model_id}")
  144. except Exception as e:
  145. logger.warning(f"删除模型缓存失败: {e}")
  146. @classmethod
  147. async def delete_user_permission(cls, user_id: str, model_id: int):
  148. """删除用户权限缓存"""
  149. redis = redis_manager.get_client()
  150. if not redis:
  151. return
  152. try:
  153. await redis.delete(f"{cls.USER_PERMISSION_PREFIX}{user_id}:{model_id}")
  154. except Exception as e:
  155. logger.warning(f"删除用户权限缓存失败: {e}")
  156. @classmethod
  157. async def delete_user_local_models(cls, user_id: str):
  158. """删除用户本地模型列表缓存"""
  159. redis = redis_manager.get_client()
  160. if not redis:
  161. return
  162. try:
  163. await redis.delete(f"{cls.USER_LOCAL_MODELS_PREFIX}{user_id}")
  164. except Exception as e:
  165. logger.warning(f"删除用户本地模型列表缓存失败: {e}")