config_cache.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. """
  2. 配置缓存服务 - 管理端专用
  3. 用于缓存 system_config 表的配置信息,支持定时刷新
  4. """
  5. from typing import Dict, Any, Optional
  6. from app.core.logger import logger
  7. from app.models.system_config import SystemConfig
  8. class ConfigCache:
  9. """配置缓存单例"""
  10. def __init__(self):
  11. self._configs: Dict[str, Any] = {}
  12. self._last_refresh: Optional[str] = None
  13. self._refresh_interval_seconds: int = 60 # 默认60秒
  14. def load_configs(self) -> Dict[str, Any]:
  15. """从数据库加载所有配置"""
  16. try:
  17. self._configs = SystemConfig.get_all_configs()
  18. from datetime import datetime
  19. self._last_refresh = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  20. logger.info(f"配置加载成功,共 {len(self._configs)} 项配置")
  21. logger.debug(f"配置内容: {self._configs}")
  22. return self._configs
  23. except Exception as e:
  24. logger.exception("配置加载失败")
  25. return self._configs
  26. def get(self, key: str, default: Any = None) -> Any:
  27. """获取配置值(从缓存)"""
  28. return self._configs.get(key, default)
  29. def get_all(self) -> Dict[str, Any]:
  30. """获取所有配置"""
  31. return self._configs
  32. def set_refresh_interval(self, seconds: int):
  33. """设置刷新间隔(秒)"""
  34. self._refresh_interval_seconds = max(1, seconds)
  35. logger.info(f"配置刷新间隔设置为 {self._refresh_interval_seconds} 秒")
  36. def get_refresh_interval(self) -> int:
  37. """获取刷新间隔(秒)"""
  38. return self._refresh_interval_seconds
  39. def get_last_refresh_time(self) -> Optional[str]:
  40. """获取上次刷新时间"""
  41. return self._last_refresh
  42. def refresh(self) -> bool:
  43. """刷新配置缓存"""
  44. try:
  45. old_configs = self._configs.copy()
  46. self.load_configs()
  47. # 检查配置变化
  48. new_keys = set(self._configs.keys()) - set(old_configs.keys())
  49. removed_keys = set(old_configs.keys()) - set(self._configs.keys())
  50. changed_keys = []
  51. for key in set(self._configs.keys()) & set(old_configs.keys()):
  52. if self._configs[key] != old_configs[key]:
  53. changed_keys.append(key)
  54. if new_keys or removed_keys or changed_keys:
  55. logger.info(f"配置已更新:")
  56. if new_keys:
  57. logger.info(f" 新增配置: {new_keys}")
  58. if removed_keys:
  59. logger.info(f" 移除配置: {removed_keys}")
  60. if changed_keys:
  61. logger.info(f" 变更配置: {changed_keys}")
  62. return True
  63. except Exception as e:
  64. logger.exception("配置刷新失败")
  65. return False
  66. # 全局配置缓存实例
  67. config_cache = ConfigCache()
  68. def get_config(key: str, default: Any = None) -> Any:
  69. """便捷函数:获取配置值"""
  70. return config_cache.get(key, default)
  71. def get_all_configs() -> Dict[str, Any]:
  72. """便捷函数:获取所有配置"""
  73. return config_cache.get_all()
  74. def load_all_configs() -> Dict[str, Any]:
  75. """便捷函数:加载所有配置"""
  76. return config_cache.load_configs()